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

标签 c++ operator-keyword inline-functions

我想为我创建的类定义运算符,我希望运算符是内联的我还希望定义在 .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:

An inline function shall be defined in every translation unit in which it is odr-used.

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

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

关于c++ - 在与声明不同的文件中定义内联运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28348900/

相关文章:

c++ - 如何从 C++ 中的堆中删除完整的对象?

c++ - 为什么编译器说我不能将项目插入到 std::set<Item> 中?

c++ - 重载 operator new - 误导性输出

c++ - 内联函数中的静态变量

c++ - 具有两个或多个变量的仿函数

c++ - Boost MultiArray 复制构造函数

c++ - 如何实现运算符重载?

c++:头函数未从库正确链接到exe

C++ - CPP 和 H 中定义的内联有什么区别

c++ - 调整半透明 Qt 小部件大小时黑色闪烁(仅当启用 Aero 时)?