C++ 使用指针的模板函数

C++ 使用指针的模板函数,c++,templates,pointers,C++,Templates,Pointers,我在这里犯了什么根本性的错误吗?我在玩弄模板和指针,但这里有错误 #include <iostream> #include <string> template <class T> void ChangeValue(T*, T); int main() { int x = 51; ChangeValue(&x, 7); std::cout << x; float y = 5.1; ChangeValue(&y, 7.9);

我在这里犯了什么根本性的错误吗?我在玩弄模板和指针,但这里有错误

#include <iostream>
#include <string>

template <class T>
void ChangeValue(T*, T);

int main()
{
int x = 51;

ChangeValue(&x, 7);

std::cout << x;

float y = 5.1;

ChangeValue(&y, 7.9);

std::cout << y;
}

template <class T>
void ChangeValue(T* Value, T NewValue)
{
    *Value = NewValue;
}
#包括
#包括
模板
无效值(T*,T);
int main()
{
int x=51;
ChangeValue(&x,7);

std::cout
&y
具有类型
float*
,其中as
7.9
具有类型
double
。编译器可以通过将
float*
匹配到
T*值来将
T
推断为
float
,或者通过将
double
匹配到
T NewValue
来推断
Template参数演绎若要成功,必须明确无误。请尝试以下操作:

float y = 5.1f;
ChangeValue(&y, 7.9f);

通过此更改,
T
被推断为
float

的类型为
float*
,其中as
7.9
的类型为
double
。编译器可以通过将
float*
T*Value
匹配,将
T
推断为
float
通过将
double
匹配到
T NewValue
。要使模板参数推断成功,必须明确无误。请尝试以下方法:

float y = 5.1f;
ChangeValue(&y, 7.9f);
通过此更改,当您使用以下命令时,
T
被推断为
float

float y = 5.1;
ChangeValue(&y, 7.9);
第一个参数的类型是
float*
,而第二个参数的类型是
double
。因此,编译器无法推断
T

解决此问题的一种方法是使用:

template <typename T1, typename T2 = T1>
void ChangeValue(T1* Value, T2 NewValue)
{
    *Value = NewValue;
}
只要你愿意,什么能起作用

    *Value = NewValue;
当您使用以下命令时,对给定的
T1
T2
有效:

float y = 5.1;
ChangeValue(&y, 7.9);
第一个参数的类型是
float*
,而第二个参数的类型是
double
。因此,编译器无法推断
T

解决此问题的一种方法是使用:

template <typename T1, typename T2 = T1>
void ChangeValue(T1* Value, T2 NewValue)
{
    *Value = NewValue;
}
只要你愿意,什么能起作用

    *Value = NewValue;

对于给定的
T1
T2

有效吗?如果不发布错误,这不是感谢Francois,似乎是我的误解。我的印象是浮动和双精度相似,但双精度更大更精确。我如何改进示例以避免此错误?是simp吗le cast是否足够?是的,需要一个MCVE。但是,另外,将错误消息放到Web搜索中也可以防止一开始就提出多余的问题。@Iloveasparagus我已经从我的评论中做出了回答。它包含了一个可能的更改来修复您的问题。您遇到了什么错误?如果不发布错误,这不是感谢s Francois,这似乎是我的误解。我的印象是浮动和双精度是相似的,但双精度更大、更精确。我如何改进我的示例以避免此错误?简单的转换是否足够?是的,需要MCVE。但是,将错误消息放入websearch也可以防止重复询问首先是问题。@ILOVESPARAGUS我已经从我的评论中做出了回答。它包含一个可能的更改来解决您的问题。将前一行更改为float y=5.1f;目前,程序正在告诉编译器创建一个双精度(5.1)VC++给出警告,警告C4305:“初始化”:从“double”截断为“float”,将前一行更改为float y=5.1f;目前,程序正在告诉编译器创建一个double(5.1)VC++给出警告,警告C4305:“初始化”:从“double”截断为“float”,将前一行更改为float y=5.1f;目前,程序正在告诉编译器创建一个double(5.1)VC++给出警告,警告C4305:“初始化”:从“double”截断为“float”,将前一行更改为float y=5.1f;目前,程序正在告诉编译器创建一个double(5.1)VC++给出警告,警告C4305:“正在初始化”:从“double”截断为“float”