LNK2019 C++ 中的嵌套类出错

LNK2019 Error with nested class in C++

提问人:Sarah 提问时间:12/27/2017 最后编辑:valianoSarah 更新时间:12/29/2017 访问量:679

问:

我是 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::P oint::P oint(int,int)” (??0Point@bar_interface@foo@@QAE@HH@Z) 在函数“public: void __thiscall中引用 foo::bar_interface::onStartup(void)” (?onStartup@bar_interface@foo@@QAEXXZ)

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

C++ 链接器错误 LNK2019

评论

3赞 Igor Tandetnik 12/27/2017
您的程序包含一个定义规则冲突,通过以不同的方式定义两次类。要实现构造函数,只需编写Pointfoo::bar_interface::Point::Point(int x, int y) { ... }
0赞 user0042 12/27/2017
什么是未定义的引用/未解析的外部符号错误以及如何修复它?
0赞 drescherjm 12/27/2017
不要定义第二个 Point 类。我的意思是,那么您正在尝试定义类 2 次。只需在源文件中实现即可。class Pointclass foo:bar_interface::Point{foo::bar_interface::Point::Point(int x, int y)
1赞 Retired Ninja 12/27/2017
你对包括警卫的工作方式有非常奇怪的想法。
0赞 Sarah 12/27/2017
@IgorTandetnik这正是问题所在。谢谢!

答:

0赞 SoronelHaetir 12/27/2017 #1

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

您需要的某个地方:

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

评论

0赞 Sarah 12/27/2017
我尝试在标头和 cpp 中添加构造函数 foo:bar_interface::P oint::P oint(int x, int y) 的完整路径,但错误仍然相同。你是这个意思吗?
0赞 273K 12/27/2017 #2

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

评论

0赞 Sarah 12/27/2017
我不确定你的意思。除了顶部的几个 #include 和 using 语句外,这是两个文件的逐字开头(在更改命名空间/类名之外)。您的意思是删除包含,还是建议我将 Point 定义移动到文件顶部?
0赞 273K 12/27/2017
不,不要删除所有带有 # 的行。删除您仅发布的那些行。