我有一个模板功能:
template<typename T>
void foo(T const & t);
该功能的一些特殊化:
template<> void foo<int>(int const & t) {
cout << t << endl;
}
template<> void foo<const char *>(const char * const & t) {
cout << t << endl;
}
我想用这个函数调用一些方法:
foo(3);
foo("Hello, world.");
但我无法弄清楚如何制定模板,以便模板类型推导得到int
和const char *
的文字。如果我这样做,那么我得到undefined reference to void foo<char [14]>(char const [14] &)
。我尝试重铸这样的模板:
template<typename T>
void foo(T t);
template<> void foo<int>(int t) { ... }
template<> void foo<const char *>(const char * t) { ... }
有效,但当然现在我得到了按值调用的语义,要求我用作模板参数的任何类类型都有一个复制构造函数。
是否无法编写具有const char *
专业化功能的pass-by-reference模板函数?
答案 0 :(得分:4)
此:
foo("Hello, world.");
不会致电foo<const char*>
。它会调用foo<char[14]>
,因为foo
需要T const&
。您的专业化没有被调用,因为它与模板的类型不同。
那就是说,不要专攻。过载:
template<typename T>
void foo(T const& );
void foo(int const& );
void foo(char const* );
这种方式更容易推理,更有可能做你真正想要的事情。