使用编译时常量会抛出错误
using compile time constant throws error
在下面的程序中,我使用了静态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));
当然,这里有一个潜在的维护问题,如果init
和dummy
的类型都更改为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文件中定义它,以便它获得一个地址。
如果你只是使用常量的值,你可以不定义它。
- 分段错误当我试图运行程序时出错
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 创建 OpenCV 非自由版本 v4.3 时出错,可折叠.cpp错误 C2039、2605
- 制作时出错,C++"db.c:2127:错误:在"||"标记之前应使用";"
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- 在VS2015中访问类成员时运行时错误,但在Linux上未访问时出错
- 如何更改路径以修复错误"./main:加载共享库 libmkl_core.so 时出错?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 安装 mply 库时出错.致命错误:gsl/gsl_sf.h:没有这样的文件或目录
- Rcpp/C++/R:比较日期时间矢量与日期时间时出错(错误:"运算符>"的不明确重载)
- 编译特征程序时出错:错误:'seq'不是'Eigen'的成员
- 可能的 GCC 链接器错误会导致将弱符号和局部符号链接在一起时出错
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 运算符重载时出错(错误:"运算符<<不匹配(操作数类型为"std::basic_ostream<char>"和"const char [2]")
- 编译类 C++ 中的线程时出错(错误 xthread)
- 加载GLEW库时出错(错误LNK2001)
- 通过函数指针调用函数时出错(错误C2064)
- 编译core.obj时出错:错误LNK2001:未解析的外部符号_harmony_core_init
- 链接c++静态库与android ndk时出错(错误:无法识别文件格式)
- 使用GCC编译游戏时出错.(错误:将"Screen"的含义从"class Screen&q