第14行的代码无法编译,因为转换没有完成,但由于显式转换运算符,16,17中的代码正常工作。转换无法完成的原因
1
2 #include <iostream>
3 using namespace std;
4 template<typename T,int N>class Array{
5 private:
6 T _M_data[N];
7 public:
---- operator T*(){return _M_data;}
---- operator T(){return _M_data[0];}
++++ T* data(){return _M_data;}
10 };
11 int main(int argc,char*argv[])
12 {
13 Array<int,5> i5A ;
14 //printf("%d\n",i5A);
15 //won't work,need explicit conversion
16 printf("%d\n",i5A.operator int());
17 printf("%p\n",i5A.operator int*());
18 return 0;
19 }
更新:
我知道为什么标准需要一个data()
功能:printf("%d\n",*(i5A.data()));
看看va_init,va参数需要知道类型,因此打印完成时会超出给定的类型(%d => int),因此printf会设想您执行JOB。在C++中,cout使用方法覆盖来为所有类型确定相同的运算符<<。当你给不同类型的过载建立正确的操作员过载 – Lefsler