gpt4 book ai didi

c++ - 模板特化不匹配错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:08 38 4
gpt4 key购买 nike

重新编辑:

C++ Primer 5th 说:

版本 1:

template <typename T> int compare(const T&, const T&);

版本 2:

template<size_t N, size_t M> int compare(const char (&)[N], const char (&)[M]);

版本 1 的特化:

template <> int compare(const char* const &p1, const char* const &p2);

For example, we have defined two versions of our compare function template, one that takes references to array parameters and the other that takes const T&. The fact that we also have a specialization for character pointers has no impact on function matching. When we call compare on a string literal: compare("hi", "mom")both function templates are viable and provide an equally good (i.e., exact) match to the call. However, the version with character array parameters is more specialized (§ 16.3, p. 695) and is chosen for this call.


书上说“两者都提供了同样好的匹配”,所以我认为放置版本 1 及其特化应该编译得很好。但它没有。

所以“提供同样好的匹配”并不意味着它可以编译?这本书在捉弄我?

原代码片段链接,我没看懂为什么编译不了: https://wandbox.org/permlink/oSCDWad03nELC9xs


完整的上下文截图(我已经把最相关的部分框起来了,抱歉在这里张贴这么大的图片)。

enter image description here enter image description here

最佳答案

C 风格的字符串不是指针,它们是数组。当模板类型推导发生时,它会将 T 推导为 const char[3]const char[4]。由于这些冲突,编译器无法推断出 T 并停在那里。

template<>
int compare(const char* const &p1, const char* const&p2) {
cout << "const char* const" << endl;
return 3;
}

不会被调用,因为它依赖于推导和匹配 const char*T 并且编译器无法推导 T .特化不是重载,它是特定 T 的配方。如果无法推导出 T,则不会调用特化,即使它是有效的重载。

如果您要重载函数而不是提供特化 then it would compile与:

int compare(const char* const &p1, const char* const&p2) {
cout << "const char* const" << endl;
return 3;
}

关于c++ - 模板特化不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52041625/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com