提问人:Sarah 提问时间:12/27/2017 最后编辑:valianoSarah 更新时间:12/29/2017 访问量:679
LNK2019 C++ 中的嵌套类出错
LNK2019 Error with nested class in C++
问:
我是 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 重新定义错误。我不知如何进行。
答:
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
不,不要删除所有带有 # 的行。删除您仅发布的那些行。
评论
Point
foo::bar_interface::Point::Point(int x, int y) { ... }
class Point
class foo:bar_interface::Point{
foo::bar_interface::Point::Point(int x, int y)