在与声明不同的文件中定义内联运算符

Defining an inline operator in a different file than the declaration

本文关键字:定义 运算符 文件 声明      更新时间:2023-10-16

我想为我创建的类定义运算符,我希望运算符内联。我还希望定义在.cpp文件中,而声明在.h文件中。我尝试这样做:

Vector3D.h

class Vector3D
{
    ...
};
inline Vector3D operator+(Vector3D lv, const Vector3D& rv);
inline Vector3D operator-(Vector3D lv, const Vector3D& rv);

Vector3D.cpp

...
inline Vector3D operator+(Vector3D lv, const Vector3D& rv)
{
    lv += rv;
    return lv;
}
inline Vector3D operator-(Vector3D lv, const Vector3D& rv)
{
    lv -= rv;
    return lv;
}

_tmain函数中,这些函数被称为:

std::cout << v1 << "+" << v2 << "=" << v1+v2 << std::endl;
std::cout << v1 << "-" << v2 << "=" << v1-v2 << std::endl;

我得到错误:

1>RotateShapes.obj : error LNK2019: unresolved external symbol "class Vector3D __cdecl operator+(class Vector3D,class Vector3D const &)" (??H@YA?AVVector3D@@V0@ABV0@@Z) referenced in function _wmain
1>RotateShapes.obj : error LNK2019: unresolved external symbol "class Vector3D __cdecl operator-(class Vector3D,class Vector3D const &)" (??G@YA?AVVector3D@@V0@ABV0@@Z) referenced in function _wmain

如果我移除inline,那么一切都很好。如果我不调用这些函数,那么编译就成功了。有没有一种方法可以在声明inline函数的不同位置定义它?

来自标准§3.2/3:

内联函数应在其使用的每个翻译单元中定义。

如果您没有在内联声明的头中定义函数,那么如何将定义引入所有使用它们的编译单元?

当然,您可以在一个单独的文件中定义函数,并将其包含在头中。从技术上讲,它们将在一个单独的文件中,但经过预处理后,它们将成为标头的一部分(然后,成为包括标头的所有编译单元的一部分)。如果这不是您想要的,那么您就不能内联声明函数。

不,不可能必须在头文件中定义内联函数。请参阅此处:C++内联类方法导致未定义的引用