使用编译时常量抛出错误

时间:2011-08-11 08:52:38

标签: c++

在下面的程序中我使用了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();
}

3 个答案:

答案 0 :(得分:3)

“确切的行为是什么?”

问题是push_back采用参考参数。您可以使用static const int成员变量的,而无需提供对象的单独定义,但您不能使用对象本身的引用(因为它不存在) 。 “使用”成员本身的含义在一个定义规则3.2 / 2的标准部分中定义。

一个解决方法是在一个翻译单元中提供定义:

const int check::init;

如果这样做,您还可以选择将= 1初始化从声明(类内)移动到定义(类外)。

另一个修复是从成员变量创建一个临时(这只使用该值,它不关心对象所在的位置,因此不关心它是否存在),然后传递对临时的引用:

dummy.push_back(int(init));

当然,那里存在潜在的维护问题,如果initdummy的类型都更改为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文件中定义,以便它获取一个地址。

如果您只使用常量的值,则可能无法定义它。