使用my array类时出现奇怪的警告 我在C++中编写了一个非常简单的数组类,并在我的应用程序中使用: /* A simple array class template that performs dynamic */ /* memory management and casting to (T*), which allows */ /* to use it as a usual array. */ template <typename T> class Array { public: //Constructor Array(unsigned long size) { try { data = new T[size]; m_size = size; } catch(...) { cout << "Could not allocate " << size << " bytes." << endl; data = NULL; m_size = 0; } } //Typecast operator operator T*() { assert(data!=NULL); return data; } //Subscript operator T& operator[] (unsigned long Index); //Destructor ~Array() { if(data!=NULL) delete[] data; } private: T * data; unsigned long m_size; }; template<typename T> T& Array<T>::operator[] (unsigned long Index) { assert(Index<m_size); assert(data!=NULL); return data[Index]; } /*执行动态*/ /*内存管理和转换到(T*),允许*/ /*将其用作常规数组*/ 模板 类数组 { 公众: //建造师 数组(无符号长大小) { 尝试 { 数据=新T[尺寸]; m_尺寸=尺寸; } 捕获(…) { 原因很简单:对于文件名[0]编译器可以使用运算符[],或者它可以使用类型转换运算符将文件名转换为字符*,然后将运算符[]应用于字符指针

使用my array类时出现奇怪的警告 我在C++中编写了一个非常简单的数组类,并在我的应用程序中使用: /* A simple array class template that performs dynamic */ /* memory management and casting to (T*), which allows */ /* to use it as a usual array. */ template <typename T> class Array { public: //Constructor Array(unsigned long size) { try { data = new T[size]; m_size = size; } catch(...) { cout << "Could not allocate " << size << " bytes." << endl; data = NULL; m_size = 0; } } //Typecast operator operator T*() { assert(data!=NULL); return data; } //Subscript operator T& operator[] (unsigned long Index); //Destructor ~Array() { if(data!=NULL) delete[] data; } private: T * data; unsigned long m_size; }; template<typename T> T& Array<T>::operator[] (unsigned long Index) { assert(Index<m_size); assert(data!=NULL); return data[Index]; } /*执行动态*/ /*内存管理和转换到(T*),允许*/ /*将其用作常规数组*/ 模板 类数组 { 公众: //建造师 数组(无符号长大小) { 尝试 { 数据=新T[尺寸]; m_尺寸=尺寸; } 捕获(…) { 原因很简单:对于文件名[0]编译器可以使用运算符[],或者它可以使用类型转换运算符将文件名转换为字符*,然后将运算符[]应用于字符指针,c++,arrays,g++,compiler-warnings,gcc-warning,C++,Arrays,G++,Compiler Warnings,Gcc Warning,更明确地说,发生了什么 filename.Array<char>::operator[](0) filename.Array::operator[](0) vs filename.Array::operator char*().operator[](0) (不知道后者是否正确C++,但它给出了发生什么的概念) 顺便说一句,几乎可以肯定这个问题以前就应该问过,但是没有找到重复的。说明GCC版本和警告标志会很好,因为我的GCC 4.8.4没有抱怨。但是Petr已经解决了,所以一切都

更明确地说,发生了什么

filename.Array<char>::operator[](0)
filename.Array::operator[](0)
vs

filename.Array::operator char*().operator[](0)

(不知道后者是否正确C++,但它给出了发生什么的概念)


顺便说一句,几乎可以肯定这个问题以前就应该问过,但是没有找到重复的。

说明GCC版本和警告标志会很好,因为我的GCC 4.8.4没有抱怨。但是Petr已经解决了,所以一切都很好。在MinGW,-Wall中的GCC 4.8.1。
操作符t*(){assert(data!=NULL);返回数据;}
似乎是构造函数的反向转换
数组(T*p){data=p};
哦,我明白了!我可以删除subscip运算符吗?@Ilya使用显式转换运算符。请参见@Ilya,似乎通过
运算符T*(){assert(data!=NULL);返回数据;}
是将
数组
转换为
T*
,by
Array(T*p){data=p;}
是将
T*
转换为
数组
。使用
显式
将阻止隐式转换。不,运算符T*返回Array.data,我看不出您在哪里找到了数组(T*p)构造函数。
warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: [enabled by default]
note: candidate 1: T& Array<T>::operator[](long unsigned int) [with T = char]
note: candidate 2: operator[](char*, int) <built-in>
filename.Array<char>::operator[](0)
filename.Array<char>::operator char*().operator[](0)