使用 STL 向量时构造函数的未解析外部符号

问题描述

所以,我在 VS2019 中有一个非常简单的项目,其中包含三个文件

a.h

gitlab-ci.yml

a.cpp

#pragma once

class A {
public:
    A();
};

main.cpp

class A {
public:
    A() {}
};

它在没有向量的情况下也能正常工作。但是此代码会引发有关构造函数链接错误。 我真正不明白的是,如果我那样更改 a.cpp:

#include <vector>
#include "a.h"

int main() {
    std::vector<A> va;
    va.emplace_back();
    return 0;
}

它工作正常。 为什么链接器看不到类体中的构造函数

解决方法

带有 main 的编译单元只看到这个声明

class A {
public:
    A();
};

实际上没有定义构造函数。

模块 a.cpp 中类 A 的声明打破了一个定义规则。即a.cpp中声明的类与a.h中声明的类不一样。

在定义模块a.cpp的情况下

#include "a.h"

A::A() {}

两个编译单元具有相同的类声明,并且为这个类定义了构造函数。