使用 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 定义了构造函数。