在与声明不同的文件中定义内联运算符
Defining an inline operator in a different file than the declaration
我想为我创建的 class 定义运算符,我希望运算符是内联的我还希望定义在 .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
函数?
不行,没办法——内联函数必须在头文件中定义。
看这里:C++ inlining class methods causes undefined reference
来自标准§3.2/3:
An inline function shall be defined in every translation unit in which it is odr-used.
如果您不在 header 中定义内联声明的函数,那么您如何将定义导入所有使用它们的编译单元?
当然,您可以在单独的文件中定义函数并将其包含在 header 中。它们在技术上将位于一个单独的文件中,但在预处理之后,它们将成为 header 的一部分(然后,成为包含 header 的所有编译单元的一部分)。如果那不是你想要的,那么你不能声明内联函数。
我想为我创建的 class 定义运算符,我希望运算符是内联的我还希望定义在 .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
函数?
不行,没办法——内联函数必须在头文件中定义。 看这里:C++ inlining class methods causes undefined reference
来自标准§3.2/3:
An inline function shall be defined in every translation unit in which it is odr-used.
如果您不在 header 中定义内联声明的函数,那么您如何将定义导入所有使用它们的编译单元?
当然,您可以在单独的文件中定义函数并将其包含在 header 中。它们在技术上将位于一个单独的文件中,但在预处理之后,它们将成为 header 的一部分(然后,成为包含 header 的所有编译单元的一部分)。如果那不是你想要的,那么你不能声明内联函数。