未定义的引用std::对
Undefined reference std::pair
人们会认为这段简单的代码应该很容易编译:
#include <utility>
struct Q {
static const int X = 0;
};
int main() {
std::pair<int, int>(Q::X, 0);
return 0;
}
然而,当我使用默认设置(cygwin gcc 4.5.3)用g++
编译它时,它会向我抛出一个链接器错误:
undefined reference to `Q::X'
我在这里完全被难住了——MSVC编译得很好,但我的gcc却没有。(MinGW也很好。)
链接器找不到Q::X
的定义。
这可能是因为std::pair<>
构造函数将参数作为常量的引用,而Q::X
是一个l值,因此需要Q::X
的外部定义才能引用它。
便携式修复程序:
int const Q::X;
您只声明X,但还必须定义它,对于静态定义,这必须发生在类之外
struct Q {
static const int X = 0;
};
int Q::X = 0;
@Maxim Yegorushkin(别烦我!)这里有一个相关的链接可能会有所帮助。
但您的问题是,int从来都不是外部定义的。如果X不必是const,那么可以用类似的方式在结构外部初始化它。主要原因是因为X是静态的。。。
struct Q {
static const int X;
};
int const Q::X = 0;
struct Q {
static int X;
};
int Q::X = 0;
相关文章:
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 未定义的引用,尽管存在符号,但 std::experimental::可选
- std::iterator::reference 必须是引用吗?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- std::unordered_map::提取引用/指针失效
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 修改在 std::future 的 lambda 中引用捕获的值
- 更改其类型后,丢失对 std::variant 对象的引用
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 在 C++20 之前,在带有常量或引用字段的"A"上调用 'std::vector<A>
- 引用 std::shared:ptr 以避免引用计数
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- std::is_class 在引用类上为 false
- 通过引用传递向量是请求 std::分配器
- 非默认可构造和 std::引用包装器替代项的序列化
- std::引用类型的可选专用化