在下面的程序中我使用了static const int init。但这是在抛出错误
/tmp/ccEkWmkT.o(.text+0x15d):在函数check::operation()':
: undefined reference to
中检查:: init'
仅当与向量一起使用时才会出现此错误。有人可以帮忙吗?什么是确切的行为??
#include<vector>
#include<iostream>
using namespace std;
class check{
static const int init=1;
public:
check(){}
void operation();
};
void check::operation(){
vector<int> dummy;
dummy.push_back(init);
}
int main(){
check ck;
ck.operation();
}
答案 0 :(得分:3)
“确切的行为是什么?”
问题是push_back
采用参考参数。您可以使用static const int
成员变量的值,而无需提供对象的单独定义,但您不能使用对象本身的引用(因为它不存在) 。 “使用”成员本身的含义在一个定义规则3.2 / 2的标准部分中定义。
一个解决方法是在一个翻译单元中提供定义:
const int check::init;
如果这样做,您还可以选择将= 1
初始化从声明(类内)移动到定义(类外)。
另一个修复是从成员变量创建一个临时(这只使用该值,它不关心对象所在的位置,因此不关心它是否存在),然后传递对临时的引用:
dummy.push_back(int(init));
当然,那里存在潜在的维护问题,如果init
和dummy
的类型都更改为long long
[*],则值会从{{更改1}}到大于1
的东西,那你就麻烦了。因此,您可以使用INT_MAX
,因为一元+运算符也会为其结果创建临时值。不过,读者和未来的维护者可能会对此感到有些困惑。
[*]假设您的实施有+init
。
答案 1 :(得分:1)
您必须在类之外(在 .cpp 文件中)提供 static 成员的定义:
//check.h (same as before)
class check
{
static const int init=1; //declaration and in-class initialization
public:
check(){}
void operation();
};
然后在check.cpp
文件中,执行以下操作:
//check.cpp
#include "check.h"
const int check::init; //definition
答案 2 :(得分:0)
如果您通过引用传递它,它将被“使用”,您可能必须在.cpp文件中定义,以便它获取一个地址。
如果您只使用常量的值,则可能无法定义它。