有人可以帮助我理解这是否正确。
考虑这个例子:
#include <iostream>
using namespace std;
template <typename T>
struct test {
};
template <typename T>
bool operator==(const test<T>& obj, const T* arr) {
return true;
}
template <typename T, size_t TN>
bool operator==(const test<T>& obj, const T (&arr)[TN]) {
return false;
}
int main() {
cout << ( test<char>() == "string" ) <<endl;
return 0;
}
使用gcc 4.7.3,它可以很好地编译并按预期输出“0”。
但是使用Visual Studio编译器,它会报告ambiguous error (C2593)
。
在这种情况下谁是对的,standard
对此有什么看法?
谢谢。
答案 0 :(得分:4)
答案 1 :(得分:1)
据我所知,简单的重载在新版本的gcc中不起作用,并且在VC10中不起作用。
所以,如果有人想知道如何解决这个问题,这是一个解决方案:
template <typename T>
struct test {
};
template <typename T>
struct parse {
};
template <typename T>
struct parse<T*> {
static bool run() {
return true;
}
};
template <typename T, size_t TN>
struct parse<T[TN]> {
static bool run() {
return false;
}
};
template <typename T, typename T2>
bool operator==(const test<T>& obj, const T2& obj2) {
return parse<T2>::run();
}
int main() {
cout << ( test<char>() == "string" ) <<endl;
cout << ( test<char>() == (char*)"string" ) <<endl;
return 0;
}
用VC10,gcc-4.6.3和gcc-4.8.1编译。 似乎工作正常。