【问题标题】:c++ Linking Error with const member function in a classc ++链接错误与类中的const成员函数
【发布时间】:2018-05-04 11:36:24
【问题描述】:

我有一个类似的声明

    class ABC_EXPORT abc
    {
    ....

public:
     xyz foo1(const arg1 a, const arg3 b) const; //defined in cpp file
     xyz foo2(const arg1 a, const arg2 b) const { return foo1(a, convert_to_arg3(b));}
    };

这被构建到一个 DLL 库中,另一个项目调用 foo2。我收到链接器错误 LNK2019 : unresolved external symbol。但是,如果我从foo2 的定义中删除const,则链接已解决。有人可以解释一下这里发生了什么吗?我在 Windows 7 上使用 VS2012

【问题讨论】:

  • 您是否尝试将定义移动到头文件并再次尝试?我认为不是标题的库只需要特殊处理
  • 您肯定在链接一个旧版本的导入库,它是在您添加 const 之前创建的。请确保项目仍然正确构建,仔细检查 .lib 文件上的时间戳,始终避免手动复制文件。
  • 您还可以检查库中的符号,解开名称,并确保它是您所期望的。
  • @HansPassant 我确实做了一个干净的构建
  • 请发布完整的链接器错误消息和 DLL 调用者使用的头文件。我认为与方法签名有关。

标签: c++ class visual-studio-2012 dll


【解决方案1】:

确保声明和定义的函数签名匹配。一个常见的错误是忘记函数定义中的const 说明符。例如,

struct A
{
    void do_foo_const(int a, int b) const;
};

// An incorrect definition.
// Notice the missing 'const' here V
void A::do_foo_const(int a, int b)
{
    ...
}


// correct definition.
void A::do_foo_const(int a, int b) const
{
    ...
}

这种分离允许函数的 const 和 non-const 版本并存,并返回不同的结果。使用此功能的 C++ 标准库中的一个示例是 std::vector<T>::at。请注意 const 版本如何返回一个 const 引用,但非 const 版本返回一个非常量引用。

【讨论】:

  • 如果你将 const 限定符从函数定义中去掉,那么它将无法编译。无论如何,有问题的函数完全定义在头文件中。这里发生了其他事情,请参阅我上面的评论。
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2020-09-29
  • 2016-12-14
  • 2021-09-11
  • 2021-01-08
相关资源
最近更新 更多