第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()));
答案 0 :(得分:6)
printf
是一个原始而简单的功能。它不知道你传递给它的类型,更不用说如何转换它们。如果您指定"%d"
,它只会读取您作为int
传递的参数,将其吐出并继续下一个参数。或崩溃。只是不要这样做。如果您做出承诺,请保留 - %d
是您传递int
的承诺。
答案 1 :(得分:2)
无法隐式执行转换,因为在printf
等可变函数中,格式字符串由运行时的printf
内部解析,并执行可变参数检索在运行时的printf
内部。对于编译器"%d\n"
只是一个字符串。编译器不解析格式字符串,也不知道如何解释该格式字符串,因此它不知道该参数需要转换,并且不知道要将其转换为什么类型。
P.S。有些编译器能够从标准函数的格式字符串中检索该信息,例如printf
。他们纯粹是出于错误检查的目的。使用这种知识进行隐式参数转换在技术上是可行的,但它会产生一个相当深远的非标准特征。这样的功能在C ++中没有地位。当然,只有在编译时实际知道该字符串时,才可能对格式字符串进行编译时解析,但情况并非总是如此。
答案 2 :(得分:0)
在第13行,没有隐式转换。字符串格式不会更改传递的对象的类型。
答案 3 :(得分:0)
您传递给printf的格式字符串指定十进制整数,但您传递的是数组。您需要传递一些可以转换为int的数值类型(或者更好的是,实际的int)。如果要打印多个值,可能需要遍历数组并打印每个元素。
答案 4 :(得分:0)
printf
是一个varargs函数。没有指定varargs函数的参数类型,因此无法知道参数应该转换为什么类型。对某些基本类型进行了一些默认转换(例如,布尔值转换为int)。但是用户定义的转换不会隐式完成。