【发布时间】: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