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 )
{
    // ...
}