请考虑以下代码段:
struct S {
template <typename T>
void insert(const T& x);
};
template <>
void S::insert<char*>(const char*& x) {}
int main() {
S s;
s.insert("");
return 0;
}
gcc无法编译它,并显示以下错误消息:
error: template-id 'insert<char*>' for 'void S::insert(const char*&)' does not match any template declaration
这个错误的原因是什么,是否有办法编写专业化以使其有效?
我不是在寻找替代解决方案,我只是想了解错误背后的逻辑。
答案 0 :(得分:5)
您指定了错误的参数类型。
请注意,对于const T&
,const
本身符合T
的要求。然后,对于T
= char*
,const T&
应为char* const &
(即引用const
指针),而不是const char* &
(即引用指向const
)。
BTW Clang提供了更明确的错误消息:
候选模板被忽略:无法匹配&#39; void(char * const&amp;)&#39;反对&#39; void(const char *&amp;)&#39;
再次BTW,对于s.insert("");
规范不会被调用,因为""
确实是const char[1]
,那么T
的类型将被推断为{ {1}},与char [1]
不匹配。如果您希望规范适用于char *
,那么它应该是
char[1]
然后
template <>
void S::insert<char[1]>(char const (&) [1]) {}
但它仅适用于S s;
s.insert("");
,即只有一个元素的char[1]
数组。我认为让它与char
合作会更有意义,那么它应该是
const char*
然后
template <>
void S::insert<const char*>(const char * const &) {}