问题描述
所以,我在 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() {}
两个编译单元具有相同的类声明,并且为这个类定义了构造函数。