struct Div
{
int i;
int j;
};
class A
{
public:
A();
Div& divs;
};
在我的构造函数定义中,我有以下
A::A() : divs(NULL)
{}
我收到以下错误:
Error72 error C2354:
'A::divs' : initialization of reference member requires a temporary variable
答案 0 :(得分:33)
必须初始化引用以引用某些内容;它不能引用任何内容,因此你不能默认构造一个包含一个的类(除非像其他人建议的那样,你定义一个全局的“null”值)。您将需要一个给定Div
的构造函数来引用:
explicit A(Div &d) : divs(d) {}
如果您希望它能够为“null”,那么您需要一个指针,而不是一个引用。
答案 1 :(得分:12)
divs是引用,而不是指针。您不能将其设置为NULL,它必须指向某种实际对象。在这里做的最好的事情可能是定义一个Div的静态/全局实例,你可以任意定义为“Null Div”(将其值设置为你不太可能使用的东西)并将div初始化为该值。像这样:
struct Div
{
int i;
int j;
};
Div NULL_DIV = { INT_MAX, INT_MAX };
class A
{
public:
A();
Div& divs;
};
A::A() : divs(NULL_DIVS)
{
}
或者,只需将div设为指针而不是引用。
*请注意,除非抛弃const,否则不能使用const引用,因为默认情况下编译器不允许您将cosnt引用赋予非const引用。
答案 2 :(得分:8)
首先,你不能有一个NULL引用。第二,必须在构造时初始化类中的所有变量引用。
答案 3 :(得分:6)
在“英语”中:引用是指某事。它不能引用 nothing (null)。这就是为什么引用使用指针更安全的原因。
答案 4 :(得分:3)
参考文献必须引用一些东西。在C ++语言中没有空引用这样的东西。如果该成员可能没有值,那么它应该是指针,或boost::optional
或类似的某种类型。
必须初始化引用以引用有效对象。
答案 5 :(得分:3)
请记住,一旦引用被初始化为指向某个东西,您就无法将其更改为指向其他内容。如果这不是所需的行为,那么您应该使用指针或对象的副本。
答案 6 :(得分:3)
编译器消息是从语言的角度来看没有意义的消息之一,但揭示了编译器的内部工作原理,即内部逻辑工作的顺序。
在您的情况下,您使用右值(NULL
)来初始化引用。当允许这样的初始化时,rvalue将转换为临时对象,引用将绑定到该临时对象。因此,编译器立即意识到它,并通过诊断消息通知您事实。
实际上,这样的伎俩只允许const
引用,所以你的代码被破坏了,因为在我们的例子中引用不是const
。此外,struct
引用(代码中的引用)无法使用NULL
rvalue(具有整数类型)进行初始化,因此也会因此而中断。
但编译器的消息却颇具误导性。消息的文本似乎暗示使用临时对象初始化成员引用是非法的。事实上,这在C ++中是合法的(一旦上述问题得到解决),虽然没有意义。但是,我想,一旦格式错误的代码至少伴有一些错误信息,那对每个人来说应该没问题......
答案 7 :(得分:2)
简单明了:
引用永远不能为NULL。
答案 8 :(得分:1)
您应该尝试初始化“divs”变量。你不能有一个提及“没有”的参考......
看看这里:
http://msdn.microsoft.com/en-us/library/bbt3ewya%28VS.80%29.aspx
希望这有点帮助!
答案 9 :(得分:1)
如其他帖子所述,引用(Div&)不能为空。因此,您可以进行的最直接的更改是在构造函数中提供引用并初始化引用成员。像这样,
class A
{
public:
A(Div& inDivs);
Div& divs;
};
public A::A( Div& inDivs )
: divs( inDivs )
{}
答案 10 :(得分:1)
class A
{
Div & ref(Div div) { return div; }
public:
A() : divs(ref(Div())) {};
Div& divs;
};
答案 11 :(得分:0)
我建议:
class A{
std::deque<object*>& que = *(std::deque<object*> *)0;
// ...
// Of course `que` is to be assigned valid deque before using it - just like pointers...
};