我试图了解 cast 运算符如何使用模板。
考虑以下代码:
#include <iostream>
using namespace std;
struct S {
int v;
};
class A {
public:
A(void* ptr) : ptr(ptr) {}
void* ptr;
template<typename T>
const T& as() const {
return *static_cast<T*>(ptr);
}
template<typename T>
operator const T&() const {
return as<T>();
}
};
int main() {
S test;
test.v = 123;
A a(&test);
S s = a.as<S>();
S s2 = a; // error here
const S& s3 = a;
cout << s.v << endl;
cout << s2.v << endl;
cout << s3.v << endl;
return 0;
}
gcc 给了我以下编译错误:
请求从“A”转换为非标量类型“S”
我知道,我可以通过添加另一个“operator T() const”来解决问题,但是为什么编译器在这种情况下不能找出正确的转换呢?
奇怪的是,clang 没有抱怨并且编译得很好。
(用gcc4.7、gcc4.8和clang3.2测试过)