C++ C++;模板优于int->;无符号转换?
我有两个函数,如下所示C++ C++;模板优于int->;无符号转换?,c++,C++,我有两个函数,如下所示 template<typename T> unsigned int myFunction(T myelement) { myelement->func(); return 2; } void myFunction(unsigned int myelement) { } visual studio 2012抱怨“int没有->func()。为什么不使用unsigned int版本?尝试编码 myFunction(2U); 或 文本2为int(非无
template<typename T>
unsigned int myFunction(T myelement)
{
myelement->func();
return 2;
}
void myFunction(unsigned int myelement)
{
}
visual studio 2012抱怨“int没有->func()。为什么不使用unsigned int版本?尝试编码
myFunction(2U);
或
文本2
为int
(非无符号int
)类型。而int
不是具有->func()的类或类型
对于unsigned
而不是定义myFunction(unsigned int)
,您可能误读了错误消息。编译器不使用该函数,而是实例化它以确定它是否是候选函数。您需要禁用不合适类型的实例化:
template<typename T>
typename std::enable_if<!std::is_fundamental<T>::value, unsigned int >::type
myFunction( T myelement )
{
// ...
}
模板
typename std::enable_if::value,unsigned int>::type
myFunction(T myelement)
{
// ...
}
我发现您的代码写得很糟糕,很难阅读;我不建议这样编码,但这是一个观点和品味的问题。简短回答:是的,一个函数模板实例化时与参数完全匹配,比一个非模板函数具有标准转换要好。例如,C++允许“通配符”版本 STD::POW成为模板()。如果重载1-3总是比模板更匹配,那么这就没有意义了。
myFunction((unsigned)2);
template<typename T>
typename std::enable_if<!std::is_fundamental<T>::value, unsigned int >::type
myFunction( T myelement )
{
// ...
}