const char *的模板方法专门化

时间:2017-07-30 10:17:11

标签: c++ templates template-specialization specialization

请考虑以下代码段:

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

这个错误的原因是什么,是否有办法编写专业化以使其有效?

我不是在寻找替代解决方案,我只是想了解错误背后的逻辑。

1 个答案:

答案 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 &) {}