【问题标题】:Defining an inline operator in a different file than the declaration在与声明不同的文件中定义内联运算符
【发布时间】:2015-02-05 16:18:40
【问题描述】:

我想为我创建的类定义运算符,我希望运算符是内联的/p>

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 函数?

【问题讨论】:

  • 如果你Vector3D是一个类,那么在.cpp文件中你需要将方法体声明为Vector3D::operator+。我认为你还需要一个返回类型
  • @Vinzenz 你也可以使用非会员表格。
  • @Vinzenz, Vector3D 是一个类,但这些运算符不是该类的成员。
  • 内联函数需要放在头文件中,以便在其他源文件中使用。
  • @IlyaMelamed 你真的需要将它们放在 cpp 文件中吗?常见的模式是在头文件末尾包含一个“.inl”文件。

标签: c++ operator-keyword inline-functions


【解决方案1】:

来自标准§3.2/3:

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

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

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

【讨论】:

    【解决方案2】:

    不,没有办法——内联函数必须在头文件中定义。 见这里:C++ inlining class methods causes undefined reference

    【讨论】:

    • 它们不必在头文件中——它们只需要在被调用时对编译器可见。
    • 有没有其他方法可以实现隐藏inline函数实现的结果?
    • @IlyaMelamed:不行。内联函数必须在每个使用它们的翻译单元中定义,因此不能“隐藏”定义。
    • 如果这是您的目标,您可以通过将它们放在另一个文件中并将其包含在头文件的末尾来隐藏它们(而不是编译器)。从类头中删除一些混乱。
    猜你喜欢
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多