Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ';从int到int*'的转换无效;_C++_Templates_Reference - Fatal编程技术网

C++ ';从int到int*'的转换无效;

C++ ';从int到int*'的转换无效;,c++,templates,reference,C++,Templates,Reference,我有一个模板类模板类SomeClass。它有一个成员T*data[10],以及一个方法: void add(const T& item){ data[indexToInsert++] = item; } 在main()中,有以下代码: SomeClass<int> container; container.add(10); 我不明白为什么我会犯这个错误。整数10作为常量引用传递给add()。然后,作为常量引用,它被分配给指针数组 要么我的一些假设是错误的(例如,T

我有一个模板类
模板类SomeClass
。它有一个成员
T*data[10]
,以及一个方法:

void add(const T& item){
    data[indexToInsert++] = item;
}
main()
中,有以下代码:

SomeClass<int> container;
container.add(10);
我不明白为什么我会犯这个错误。整数
10
作为常量引用传递给
add()
。然后,作为常量引用,它被分配给指针数组

要么我的一些假设是错误的(例如,
T*data[10]
实际上是指针数组吗?),要么我认为不可行的东西


请解释此失败的技术原因以及如何修复。

成员
数据
声明为
T*
数组,即您自己所说的指针数组

T* data[10] // 'data' is an array of T*.
要声明
T
的数组,请使用:

T data[10]; // 'data' is an array of T.
出现错误是因为您试图将
int
分配给
int*
类型的数组元素。有符号整数不能隐式转换为地址/指针

还要记住,引用基本上是对象的别名,即它的行为就像传递对象本身一样,但具有引用语义。不能将引用指定给指针,但可以将引用指定给对象

例子
inti=5;
int&r=i;//提及“i”;
int*p=&i;//指向“i”的指针。

std::cout你一针见血:T*data[10]是一组指针

将您的成员数组更改为:

T data[10];

…你会没事的。

T*data[10]
是一个类型为
T
的指针数组。您可能需要一个
T
数组,因此正确的做法是
void add(const T&item){data[indexToInsert++]=&item;}
?也就是说,由于
data[indexToInsert++]
是一个指针,我应该为它分配
引用的任何内容的地址?@AvivCohn是,如果您的目的是存储传递给
数组::add
的对象的地址。但是请记住,如果指针指向的对象被破坏,您将得到悬空指针,该指针是UB访问的。我的目的是通过引用存储此类中的所有项。但是由于C++不允许引用数组,所以我决定了一组指针。BTW C++容器通常通过引用(即指针或引用)或值来存储内容吗?@标准库中的容器AvivCoHn容器主要是模板,这意味着您可以在编译时指定值类型。指定的值类型总是按值存储。例如,如果我在向量中存储
对象
,那么
对象
会复制到向量中吗?当我取回它时,它又被复制了?
int  i = 5;
int& r = i;  // Reference to 'i';
int* p = &i; // Pointer to 'i'.

std::cout << r << std::endl; // Outputs '5'.
std::cout << p << std::endl; // Outputs the address of 'i'.
T data[10];