2013-06-13 35 views
0

第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

看看va_init,va参数需要知道类型,因此打印完成时会超出给定的类型(%d => int),因此printf会设想您执行JOB。在C++中,cout使用方法覆盖来为所有类型确定相同的运算符<<。当你给不同类型的过载建立正确的操作员过载 – Lefsler

回答

6

printf是一种原始和简单的功能。它不知道你传入的是什么类型,更不用说如何转换它们。如果您指定"%d",它将只读取您传递的参数int,吐出并继续下一个参数。或者崩溃。只是不要这样做。如果你作出承诺,保留它 - %d是你承诺通过int

+0

伟大的答案!是的,printf()有它的怪癖。 –

0

在第13行,没有隐式转换。字符串格式不会更改传递的对象的类型。

0

您传递给printf的格式字符串指定一个十进制整数,但您传递的是数组。你需要传递一些可以转换为int的数字类型(或者更好的是,一个实际的int)。如果要打印多个值,则可能需要遍历数组并打印每个元素。

2

转换不能因为在像printf格式字符串是由printf的内部在运行时解析和通过的printf的内部在运行时进行可变参数参数检索参数可变型函数隐式进行。对于编译器"%d\n"只是一个字符串。编译器不解析格式字符串,也不知道如何解释该格式字符串,因此它不知道该参数需要转换,并且不知道将其转换为什么类型。

P.S.某些编译器可以从标准函数的格式字符串中检索该信息,如printf。他们纯粹是为了错误检查的目的。将这些知识用于隐式参数转换在技术上是可行的,但它会产生一个相当深远的非标准特征。这个特性在C++中没有地位。当然,编译时格式化字符串的解析只有在编译时实际知道该字符串时才有可能,但并非总是如此。

0

printf是可变参数函数。 varargs函数的参数类型没有指定,因此无法知道参数应该转换为什么类型。某些基元类型有一些默认转换(例如,布尔转换为int)。但用户定义的转换不会隐式完成。

相关问题