C++ 只有一个模板专业化有用吗?

C++ 只有一个模板专业化有用吗?,c++,c++11,templates,tostring,template-specialization,C++,C++11,Templates,Tostring,Template Specialization,我想知道以下方法之间的主要区别是什么。如果定义了std::to_字符串,是否存在两种情况之一会导致问题的情况 include <string> using namespace std; enum class eColor { Red }; void to_string(eColor color) { } template<typename C = eColor) void to_string(C color) { } int main() { to_s

我想知道以下方法之间的主要区别是什么。如果定义了std::to_字符串,是否存在两种情况之一会导致问题的情况

include <string>
using namespace std;


enum class eColor
{
   Red
};

void to_string(eColor color)
{
}

template<typename C = eColor)
void to_string(C color)
{
}



int main()
{
   to_string(eColor::Red); // assume only one of the above is defined
   return 0;
}

有没有一种情况应该优先选择上面的一种?

尽管你的using指令对名称空间造成了不必要的污染,但如果你打算使用类似以下字符串的名称,这一点尤其奇怪:

模板函数自动推断其模板参数。因此,以下内容绝对有效:

int main(int argc, const char * argv[]) {
    to_string(eColor::Red);
    to_string("Hey");
    to_string(42);
    return 0;
}
因此,如果你真的打算将你的函数泰勒化为一种专用类型,你会遇到一些非常有趣的错误消息,甚至更糟糕的是,没有错误消息和不必要的行为

功能版本将至少防止一些错误情况。
由于存在隐式转换,因此它仍将接受42。stringeColor color的函数实际上不是一个模板专门化,因为它在定义之前遗漏了模板。因此编译器将其视为完全定义的函数,而不是使用具体类型生成的模板。这意味着只要编译器能够匹配参数列表,就会始终使用此函数。

您的模板将造成混乱。还有,你为什么想要一个模板?我不认为模板版本有什么意义。但是你的例子太简单了,你也应该展示它的实现。@juanchopanza我真的想知道是否有任何正当的理由。@juanchopanza别介意,我的大脑在休假。