使用 STL 向量时构造函数的未解析外部符号
Unresolved external symbol of constructer when using STL vectors
所以,我在 VS2019 中有一个非常简单的项目,其中包含三个文件:
a.h
#pragma once
class A {
public:
A();
};
a.cpp
class A {
public:
A() {}
};
main.cpp
#include <vector>
#include "a.h"
int main() {
std::vector<A> va;
va.emplace_back();
return 0;
}
没有矢量也能正常工作。但是此代码会引发有关构造函数的链接器错误。
我真的不明白的是如果我这样改变a.cpp:
#include "a.h"
A::A() {}
它工作正常。
为什么链接器看不到 class 主体中的构造函数?
带main的编译单元只看到这个声明
class A {
public:
A();
};
而且确实没有定义构造函数。
模块a.cpp中classA的声明打破了一个定义规则。即 a.cpp 中声明的 class 与 a.h 中声明的 class 不同。
在本例中定义了模块a.cpp
#include "a.h"
A::A() {}
两个编译单元具有相同的 class 声明,为此 class 定义了构造函数。
所以,我在 VS2019 中有一个非常简单的项目,其中包含三个文件:
a.h
#pragma once
class A {
public:
A();
};
a.cpp
class A {
public:
A() {}
};
main.cpp
#include <vector>
#include "a.h"
int main() {
std::vector<A> va;
va.emplace_back();
return 0;
}
没有矢量也能正常工作。但是此代码会引发有关构造函数的链接器错误。 我真的不明白的是如果我这样改变a.cpp:
#include "a.h"
A::A() {}
它工作正常。 为什么链接器看不到 class 主体中的构造函数?
带main的编译单元只看到这个声明
class A {
public:
A();
};
而且确实没有定义构造函数。
模块a.cpp中classA的声明打破了一个定义规则。即 a.cpp 中声明的 class 与 a.h 中声明的 class 不同。
在本例中定义了模块a.cpp
#include "a.h"
A::A() {}
两个编译单元具有相同的 class 声明,为此 class 定义了构造函数。