首页 > 解决方案 > 使用 STL 向量时构造函数的未解析外部符号

问题描述

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

#pragma once

class A {
public:
    A();
};

a.cpp

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

主文件

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

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

没有向量它工作正常。但是这段代码引发了关于构造函数的链接器错误。我真正不明白的是,如果我以这种方式更改 a.cpp:

#include "a.h"

A::A() {}

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

标签: c++classdeclarationconstruct

解决方案


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

class A {
public:
    A();
};

确实没有定义构造函数。

模块 a.cpp 中类 A 的声明打破了单一定义规则。那就是a.cpp中声明的类和ah中声明的类不一样

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

#include "a.h"

A::A() {}

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


推荐阅读