【问题标题】:LNK2019 Error with nested class in C++LNK2019 C++ 中的嵌套类错误
【发布时间】:2018-06-07 11:32:19
【问题描述】:

我是 C++ 新手,如果这是一个简单或明显的错误,我很抱歉。我一直在阅读很多其他问题和文档,但我还没有找到解决方案。

我正在尝试将新的类定义添加到现有的大型项目中。没有我的补充,一切都编译得很好。但是,当我在下面添加代码时,我在构造函数方法(以及任何其他方法)上收到 LNK2019 错误。我注意到添加/引用属性不会导致此链接器错误,只会导致方法。以下是产生错误的最简单示例:

标题:

namespace foo
{
  class bar_interface
  {
    public:

    //My code
    #ifndef Point_H
    #define Point_H
      class Point
      {
      public:
        Point(int x, int y);
      };
    #endif

    //existing code
    void onStartup();        
  }
}

类:

//My code
#ifndef Point_H
#define Point_H
class foo:bar_interface::Point{
public:
    Point(int x, int y)
    {
    };
};
#endif

//existing code
void bar_interface::onStartup()
{
  foo::bar_interface::Point p( (int)8, (int)8 );
  //continue existing code
}

错误 1 ​​错误 LNK2019: 无法解析的外部符号 "public: __thiscall foo::bar_interface::Point::Point(int,int)" (??0Point@bar_interface@foo@@QAE@HH@Z) 在函数“public: void __thiscall”中引用 foo::bar_interface::onStartup(void)" (?onStartup@bar_interface@foo@@QAEXXZ)

我意识到可能不需要对 Point 进行此类显式调用或将数字转换为整数,但我想确保我没有遗漏任何明显的东西(删除它们不会改变错误)。我尝试将“Point”类移动到它自己的文件中,并在“bar_interface”之外但在“foo”命名空间内定义它。删除 #ifndef 代码会创建 C2011 重新定义错误。我不知道如何进行。

【问题讨论】:

  • 您的程序包含一个定义规则违规,通过定义类Point 两次,不同。要实现构造函数,只需写foo::bar_interface::Point::Point(int x, int y) { ... }
  • 不要定义第二个 Point 类。我的意思是 class Point 然后 class foo:bar_interface::Point{ 你试图定义类 2 次。只需在源文件中实现foo::bar_interface::Point::Point(int x, int y)
  • 你对包含守卫的工作方式有非常奇怪的想法。
  • @IgorTandetnik 这正是问题所在。谢谢!

标签: c++ linker-errors lnk2019


【解决方案1】:

未解析的外部意味着缺少定义,即链接器找不到命名函数的实现。

你需要的地方:

namespace foo
{
  bar_interface::Point::Point(int,int)
  { ... }
}

【讨论】:

  • 我尝试在标头和cpp中添加构造函数foo:bar_interface::Point::Point(int x, int y)的完整路径,但错误仍然相同。这是你的意思吗?
【解决方案2】:

从上面的代码中删除所有以 # 开头的行,问题的原因就变得更清楚了。

【讨论】:

  • 我不确定你的意思。除了顶部的一些 #include 和 using 语句之外,这是两个文件的逐字开头(除了更改命名空间/类名之外)。您的意思是删除包含,还是建议我将 Point 定义移到文件顶部?
  • 不,不要删除所有带 # 的行。删除您仅发布的那些行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多