为什么否定静态成员变量会产生链接器错误
Why does negating a static member variable produce a linker error?
请考虑以下mini示例
// CFoo.hpp
class CFoo{
private:
static const double VPI = 0.5;
public:
double getVpi();
};
// CFoo.cpp
#include "CFoo.hpp"
double CFoo::getVpi(){
double x = -VPI;
return x;
}
// main.cpp
#include "CFoo.hpp"
int main(){
CFoo aFoo();
return 0;
}
使用GCC版本4.5.1衬托程序会产生错误CFoo.cpp: undefined reference to CFoo::VPI
。错误剂量不发生
- vpi不被否定
- 否定写为
double x = -1 * VPI;
- 类CFO的声明和定义发生在同一文件中
您知道此错误的原因吗?
您的代码有多个问题。主要是,这不是有效的C 03:
class CFoo{
private:
static const double VPI = 0.5;
// ...
};
静态数据成员的声明可以在且仅当该初始化器为const
积分或const
枚举类型时指定常数初始化程序。0.5
都不是这些,因此您的代码无效C 。 9.4.2静态数据成员涵盖以下内容:
2/静态数据成员在其类定义中的声明是 不是定义[...]静态数据成员的定义 出现在封闭会员类定义的名称空间范围中。 [...]
4/如果静态数据成员是const积分或句子枚举 类型,其在类定义中的声明可以指定 恒定量子器,这将是整体恒定表达式 (5.19)。
为了初始化VPI
,您必须在CPP文件中这样做:
标题:
class CFoo{
private:
static const double VPI;
};
CPP:
const double CFoo::VPI = 0.5;
另一个无关的问题在这里:
int main(){
CFoo aFoo(); // NOT OK
return 0;
表达式CFoo aFoo();
不做您认为的事情。您认为它声明了CFoo
类型的对象aFoo
,并使用CFoo
的默认构造函数初始化它。但是,实际上要做的是声明一个名为 aFoo
的函数,没有参数,返回 CFoo
逐个值。这被称为最烦人的解析。为了做您想做的事,简单省略了括号:
CFoo aFoo;
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Visual Studio mkl_link_tool.exe链接错误
- C++ 实现模板单例类时出现链接错误
- 使用类模板的方法链接错误
- MySQL C++连接器链接错误
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 运行 C++ 单元测试时LNK2005链接错误
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 链接错误,包括我创建的相同头文件 - C++
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 使用标头保护的多个定义链接错误
- 链接错误:未定义对 stdscr 和 wgetch 的引用
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- 升压program_options中的链接错误
- 使用 g++ 预处理器进行替换会导致链接错误
- 在调试配置中编译工作正常,但发布会给出链接错误
- 相邻矩阵设置链接错误
- 包含常量变量并包含在多个文件中的标头的链接错误
- C++链接错误,我理解但无法解决
- 是什么导致macOS Mojave上的GoogleTest链接错误