Mic*_*rst 12 c++ compiler-errors
关于以下模板函数,这是关于此问题中的代码的无关问题.
template <class T>
class Object : public Container {
public:
T& object;
Object(const T& obj) : object(obj) {}
};
Run Code Online (Sandbox Code Playgroud)
这是调用构造函数的代码:
template <class T>
void Array::add_element(const T& element)
{
vec.push_back(new Object<T>(element));
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译得很好,但是只要我添加一行就main可以调用它:
Array array;
int i = 3;
array.add_element(i);
Run Code Online (Sandbox Code Playgroud)
我收到编译器警告:error: invalid initialization of reference of type 'int&' from expression of type 'const int'.
那是什么?我通过了int.它不应该自动转为const int&我吗?为什么编译器会抱怨?
Ste*_*sop 13
obj是一个const引用.object是一个非const引用.
您不能从const引用初始化非const引用,因为这样做会破坏首先使用const引用的目的.
如果您希望您的实例Object能够修改int传递给其构造函数的实例,那么构造函数应该采用非const引用.如果不这样做,那么数据成员应该是const引用.
在任何情况下,如果您使用new分配具有引用作为数据成员的对象,则会为自己存储故障.这是你的问题,确保你删除Object之前i超出范围(或者无论如何,确保在超出范围后Object不使用其成员.objecti
您尝试将const引用分配给非const引用.这意味着您的Object类可以修改对象的内容.
const int myConstNumber = 4;
Object<int> intObj(myConstNumber);
intObj.object = 3; // you have indirectly modified the value of myConstNumber
Run Code Online (Sandbox Code Playgroud)
C++不允许你这样做.您可以制作对象的副本或将const添加到属性中.
template <class T>
class Object : public Container {
public:
T object; // valid
Run Code Online (Sandbox Code Playgroud)
要么
template <class T>
class Object : public Container {
public:
const T& object; // valid
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您无法修改对象