每个构造函数,方法和运算符重载的c ++多重定义错误

neb*_*rot 3 c++ multiple-definition-error

我已经意识到这里已经存在很多"多重定义"的问题了,但是我花了2个多小时寻找解释而没有找到解释.很抱歉,如果这是重复的话.

现在我有2个类:Array.h和Vector.h.既没有任何全局变量,也没有依赖于另一个(即Array不使用Vector而Vector不使用Array).实现在.h文件中.

这是我的Main.cpp:

#include <iostream>
#include "Array.h"
#include "Vector.h"
using namespace std;

int main() {
    cout << "Done" << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

......一切都运行良好.但是,当我使用#include语句创建另一个.cpp文件时......

DataReader.cpp

#include "Array.h"
#include "Vector.h"
Run Code Online (Sandbox Code Playgroud)

...然后一切都爆炸了,我在Vector中的每个方法,构造函数和运算符重载都得到了一大堆错误:

DataReader.o: In function `Vector':
C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:49: multiple definition of `Vector::Vector()'
TestMain.o:C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:49: first defined here
DataReader.o: In function `Vector':
C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:53: multiple definition of `Vector::Vector(int const&, int const&, int const&)'
TestMain.o:C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:53: first defined here
DataReader.o: In function `Vector':
C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:56: multiple definition of `Vector::Vector(double const&, double const&, double const&)'
TestMain.o:C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:56: first defined here
DataReader.o: In function `ZNK6Vector1xEv':
C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:59: multiple definition of `Vector::x() const'
TestMain.o:C:\C++\Eclipse CDT\workspace\3D_Adaptive_FEM\Debug/..//Vector.h:59: first defined here

etc...
Run Code Online (Sandbox Code Playgroud)

但是,如果我只是#include "Array.h"在DataReader.cpp中,那么一切运行正常!

可能出错的#include "Vector.h"是什么不适用于#include "Array.h"

编辑:将实现分成.cpp文件修复错误,但这并不能解释为什么我必须为Vector而不是Array执行此操作.

Mic*_*ild 8

我怀疑你在标题中有这些函数的外部定义.例如

#ifndef VECTOR_H
#define VECTOR_H

class Vector
{
public:
    Vector(int x, int y, int z);
private:
    int m_x, m_y, m_z;
};

Vector::Vector(int x, int y, int z)
    : m_x(x), m_y(y), m_z(z)
{}

#endif
Run Code Online (Sandbox Code Playgroud)

由于构造函数的定义在类定义中不是内联的,因此编译器不会隐式地使用它inline.现在,如果您在多个翻译单元(即*.cpp文件)中包含相同的文件,链接器将产生您看到的错误,因为每个*.cpp文件将包含其自己的构造函数定义,而不会将它们标记为内联函数.

解决方案很简单,只需inline在构造函数声明前面放一个:

class Vector
{
public:
    inline Vector(int x, int y, int z);
    // ...
};

// ...
Run Code Online (Sandbox Code Playgroud)

或者,如果函数体很短,就像上面显示的构造函数一样,直接将函数定义内联到类定义中,如

class Vector
{
public:
    Vector(int x, int y, int z)
        : m_x(x), m_y(y), m_z(z)
    {}
    // ...
};

// ...
Run Code Online (Sandbox Code Playgroud)

  • @icepack显然你从来没有使用模板编程...由于英特尔编译器是我所知道的唯一例外,当前的编译器不允许你像对非模板化代码那样将接口与模板的实现分开. (2认同)