2016-08-03 19 views
0

模板函数我有一个模板函数:传递按引用`为const char *`专业化

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."); 

但我无法弄清楚如何制定模板,以便模板类型de管道获得文字intconst 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 *专业化的作品?

+2

[FYI]字符串文字的类型为“const char [n]'而不是'const char *'。 – NathanOliver

+0

任何理由更喜欢'template <> void foo (int const&t)'over'template <> void foo (int t)'?我宁愿通过值原始类型传递 – Danh

回答

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*); 

它更容易推理,更有可能做你真正想要的东西。

+0

当然。在混合中加入超载是我错过的。谢谢。 – Tom

+0

我明白了第一点 - 只是没有如何获得我所期待的效果。 – Tom