因此,我在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.pp:
#include "a.h"
A::A() {}
它运行良好。为什么链接器在类的主体中看不到构造函数?
带有main的编译单元只看到这个声明
class A {
public:
A();
};
实际上,构造函数并没有被定义。
模块.cpp中类A的声明打破了一个定义规则。也就是说,在a.pp中声明的类与在a.h.中声明的类别不同
在模块定义的情况下,a.cpp
#include "a.h"
A::A() {}
两个编译单元都有相同的类声明,并且为这个类定义了构造函数。