以下是代码,我希望将非静态数据成员check
与类中定义的常量数据成员NULL_NODE
进行比较。
为什么无法比较?
建议的方法是如何获得代码中描述的is_null
功能并使NULL_NODE
成为不可修改的实体?
class test {
public:
struct st {
int check;
bool is_null() const { return NULL_NODE == check; }
};
private:
const int NULL_NODE{-1};
};
int main() {
return 0;
}
使用以下命令编译代码:
g++ -std=c++11 test.cpp
报告异常:
test.cpp: In member function ‘bool test::st::is_null() const’:
test.cpp:8:39: error: invalid use of non-static data member ‘test::NULL_NODE’
bool is_null() const { return NULL_NODE == check; }
^
test.cpp:12:27: note: declared here
const int NULL_NODE{-1};
答案 0 :(得分:2)
为什么要在non-static
内引用struct st
变量?这是不可能的,因为您永远不会知道应该引用哪个test
实例。
换句话说,内部结构没有引用周围的类 - 要比较,在Java内部类中确实有引用,除非内部类被声明为static
。
请注意以下代码的编译方式:
int main() {
test::st x; /* instance of your struct, without any reference to "test" class" */
return 0;
}
因此,您需要将NULL_NODE
声明为static const
。
答案 1 :(得分:0)
NULL_NODE是常量,但它不是静态的,即每个测试'实例将有自己的副本,因此一个' st'实例无法知道引用哪一个;解决方案是使其静止。
在pre-c ++ 17中,您还应该在某个翻译单元中定义它(除非使用非ODR)(或使用静态内联成员函数);从c ++ 17开始,我们有内联变量,因此您只需将其定义为' static constexpr' (constexpr成员自动内联和常量)。