【发布时间】:2021-12-11 20:51:45
【问题描述】:
你好,我有这个例子:
#include <iostream>
template <typename T>
int compare(T const&, T const&);
template <typename T>
int compare(T*, T*);
template <>
int compare(char const * const&, char const* const&);
template <unsigned N, unsigned M>
int compare(char const (&)[N], char const(&)[M]);
template <unsigned N>
int compare(char const (&)[N], char const(&)[N]);
template <typename T>
int compare(T const& lhs, T const& rhs){
std::cout << "compare(T const&, T const&)\n";
if(std::less<T>()(lhs, rhs))
return -1;
if(std::less<T>()(rhs, lhs))
return 1;
return 0;
}
template <typename T>
int compare(T* p1, T* p2){
std::cout << "compare(T*, T*)\n";
if( std::less<T>()(*p1, *p2) )
return -1;
if( std::less<T>()(*p2, *p1) )
return 1;
return 0;
}
template <>
int compare(char const * const& p1, char const* const& p2){
std::cout << "compare(char const * const &, char const * const &)\n";
return strcmp(p1, p2);
}
template <unsigned N, unsigned M>
int compare(char const (&ra)[N], char const(&rb)[M]){
std::cout << "compare(char const(&)[N], char const(&)[M])\n";
return strcmp(ra, rb);
}
template <unsigned N>
int compare(char const (&ra)[N], char const(&rb)[N]){
std::cout << "compare(char const(&)[N], char const(&)[N])\n";
return strcmp(ra, rb);
}
int main(){
int a = 10, b = 57;
char const* const cp1 = "Hello";
char const* const cp2 = "World";
std::cout << compare(a, b) << '\n';
std::cout << compare(&a, &b) << '\n';
std::cout << compare(cp1, cp2) << '\n';
// std::cout << compare("Hi", "Hi") << '\n'; // error: ambiguous
// std::cout << compare("Hi", "World!") << '\n'; // error: ambiguous
cout << '\n';
}
-
为什么调用
compare传递两个常量字符数组即使是不同长度的数组也是模棱两可的? -
事实上,具有单个非类型参数
N的第二个重载只是为了与 C++ 11 兼容,因为在 C++14 及更高版本上我可以使用std::enable_if。请 -
为什么还要传递
compare(cp1, cp2);调用compare(T*, T*)而不是compare(char const* const&, char const * const&)? -
最后一个问题:我在这里声明函数模板的顺序是否会影响首选函数?谢谢。
更新:
我已经设法通过仅更改版本的签名来使其工作,该版本的签名采用两个指向参数类型的指针:compare(T*, T*) 到:
template <typename T>
int compare(T const * const&, T const* const&);
现在它工作正常,你能解释一下原因吗?
【问题讨论】:
-
但是你真的真的应该限制你的帖子关于一个问题的一个问题。主题指南对此非常明确。
-
离题:指针变体不应该也接受 const 指针吗 (
T const*)? -
哦,顺便说一句,有一种方法可以更好地编写一般比较:
return std::less(rhs, lhs) - std::less(lhs, rhs);(给false - true=0 - 1=-1onlhs < rhs,1 - 0在>和0 - 0上平等)。
标签: c++ overloading template-specialization function-templates