使用编译时常量会抛出错误

using compile time constant throws error

本文关键字:出错 错误 常量 编译      更新时间:2023-10-16

在下面的程序中,我使用了静态const int init。但这是抛出错误/tmp/ccEkWmkT.o(.text+0x15d): In function check::operation()': : undefined reference to check::init'

此错误仅在与vector一起使用时出现。有人能帮帮我吗?确切的行为是什么?

#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();
}

"确切的行为是什么?"

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

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

const int check::init;

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

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

dummy.push_back(int(init));

当然,这里有一个潜在的维护问题,如果initdummy的类型都更改为long long[*],并且值从1更改为比INT_MAX更大的值,那么您就有麻烦了。出于这个原因,您可以使用+init,因为一元+操作符也为其结果创建了一个临时对象。不过,读者和未来的维护者可能会对此感到有点困惑。

[*]假设你的实现有long long .

您必须在类之外(在.cpp文件中)提供静态成员的定义:

//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

如果您通过引用传递它,则它是"used",并且您可能必须在.cpp文件中定义它,以便它获得一个地址。

如果你只是使用常量的值,你可以不定义它。

相关文章: