【发布时间】:2009-11-13 02:22:05
【问题描述】:
template <typename T>
class v3 {
private:
T _a[3];
public:
T & operator [] (unsigned int i) { return _a[i]; }
const T & operator [] (unsigned int i) const { return _a[i]; }
operator T * () { return _a; }
operator const T * () const { return _a; }
v3() {
_a[0] = 0; // works
_a[1] = 0;
_a[2] = 0;
}
v3(const v3<T> & v) {
_a[0] = v[0]; // Error 1 error C2666: 'v3<T>::operator []' : 2 overloads have similar conversions
_a[1] = v[1]; // Error 2 error C2666: 'v3<T>::operator []' : 2 overloads have similar conversions
_a[2] = v[2]; // Error 3 error C2666: 'v3<T>::operator []' : 2 overloads have similar conversions
}
};
int main(int argc, char ** argv)
{
v3<float> v1;
v3<float> v2(v1);
return 0;
}
【问题讨论】:
-
问题是?
-
这是一个众所周知的例子,即转换函数使事情出错。它还作为示例出现在“C++ 模板 - 完整指南”中。
-
这就是为什么
std::string有一个data和一个c_str成员并且没有转换运算符。它避免了不必要的痛苦。
标签: c++ visual-c++ operator-overloading