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*
,其中as7.9
具有类型double
。编译器可以通过将float*
匹配到T*值来将T
推断为float
,或者通过将double
匹配到T NewValue
来推断Template参数演绎若要成功,必须明确无误。请尝试以下操作:
float y = 5.1f;
ChangeValue(&y, 7.9f);
通过此更改,T
被推断为float
的类型为float*
,其中as7.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”