0

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

矢量3D.h

class Vector3D
{
    ...
};

inline Vector3D operator+(Vector3D lv, const Vector3D& rv);
inline Vector3D operator-(Vector3D lv, const Vector3D& rv);

矢量3D.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在声明函数的不同位置定义函数?

4

2 回答 2

2

根据标准§3.2/3:

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

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

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

于 2015-02-05T16:39:23.050 回答
0

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

于 2015-02-05T16:23:02.997 回答