为什么转换无法完成

时间:2013-06-13 00:55:24

标签: c++

第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()));

5 个答案:

答案 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)。但是用户定义的转换不会隐式完成。