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

4

5 回答 5

6

printf是一个原始而简单的函数。它不知道您传递给它的类型,更不用说如何转换它们了。如果您指定"%d",它只会读取您作为 传递的参数,将其int吐出并继续下一个参数。或者崩溃。只是不要这样做。如果您做出承诺,请遵守它 - 这%d是您传递的承诺int

于 2013-06-13T00:56:58.177 回答
2

转换不能隐式完成,因为在诸如printf格式字符串之类的可变参数函数中,由 at 的内部结构解析,printf可变参数检索由printfat的内部结构执行。因为编译器"%d\n"只是一个字符串。编译器不解析格式字符串,也不知道如何解释该格式字符串,因此它不知道参数需要转换,也不知道将其转换为什么类型。

PS 一些编译器能够从标准函数的格式字符串中检索该信息,例如printf. 他们这样做纯粹是为了检查错误。将这些知识用于隐式参数转换在技术上是可行的,但它会产生一个影响深远的非标准特性。这种特性在 C++ 中没有位置。而且,当然,格式字符串的编译时解析只有在该字符串在编译时实际已知时才有可能,但情况并非总是如此。

于 2013-06-13T00:59:53.610 回答
0

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

于 2013-06-13T00:57:32.360 回答
0

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

于 2013-06-13T00:59:00.417 回答
0

printf是一个可变参数函数。没有指定 varargs 函数的参数类型,因此无法知道应将参数转换为什么类型。对某些原始类型进行了一些默认转换(例如,布尔值转换为 int)。但用户定义的转换不会隐式进行。

于 2013-06-13T01:01:53.643 回答