【问题标题】:"Unresolved external symbol public _thiscall" linker error calling constructor and destructor“未解析的外部符号公共_thiscall”链接器错误调用构造函数和析构函数
【发布时间】:2016-01-07 18:50:54
【问题描述】:

这似乎是重复的。相反,我试图在 StackOverflow 上找到与我的问题类似的帖子,但我无法解决链接器错误。

这些是链接器错误:

1.

LNK2001 无法解析的外部符号“public: __thiscall ged::Mathematichs::GFraction::~GFraction(void)”(??1GFraction@Mathematichs@ged@@QAE@XZ)

和 2.

LNK2001 未解析的外部符号“public: __thiscall ged::Mathematichs::GFraction::GFraction(int,int)”(??0GFraction@Mathematichs@ged@@QAE@HH@Z)

我已将此项目链接到我的静态库(其中定义了 GFraction)。 问题不在于与库的链接,因为我在该库中还有其他实际工作的类。

这是构造函数和析构函数的定义

#ifndef GFraction_H
#define GFraction_H
#include <string>

namespace ged
{
   namespace Mathematichs
   {
      class GFraction
      {
      public:
          GFraction();
          GFraction(int num, int den);
      };
    }
  }
  #endif

在 .cpp 文件中我有这个:

#include "GFraction.h"

using namespace ged::Mathematichs;

GFraction::GFraction() {}
GFraction::~GFraction() {}

但是,如果我尝试在 .h 文件中直接实现构造函数和析构函数的主体,链接器错误就会消失。

为什么?我希望那些在 .cpp 文件中!

【问题讨论】:

  • GFraction 类的分子和分母在哪里?
  • @val 它们是私有变量。我没有把它们写在这里以免造成混乱

标签: linker


【解决方案1】:

在您的.cpp 文件中,using 指令:

using namespace ged::Mathematichs;

将任何已经存在的定义导入全局命名空间 在命名空间ged::Mathematichs。它没有添加任何新定义 到那个命名空间。特别是它没有添加定义:

GFraction::GFraction() {}
GFraction::~GFraction() {}

到那个命名空间,正如链接器告诉你的那样,它们需要在哪里。他们 保留在全局命名空间中。像这样写你的头文件:

#ifndef GFraction_H
#define GFraction_H
#include <string>

namespace ged
{
    namespace Mathematichs
    {
        class GFraction
        {
        public:
            GFraction();
            ~GFraction(); // <- You need to declare the destructor
            GFraction(int num, int den);
        };
    }
}

你的.cpp 文件是这样的:

#include "GFraction.h"

namespace ged {
namespace Mathematichs {

GFraction::GFraction() {}
GFraction::~GFraction() {}
GFraction(int num, int den) { ... }

} // namespace Mathematichs
} // namespace ged

将定义放在与声明相同的命名空间中。

【讨论】:

  • 在 .cpp 中,他使用包含类的命名空间的 using 指令。我也想实现这个目标
  • 我不是在猜测:我是在告诉您您的代码有什么问题。您链接到的Array.cpp 也有问题(恐怕是垃圾)。
  • 我按照您的建议制作了 .cpp,但出现以下错误:prntscr.com/9na25y
  • @Michele 根据您已经发布的代码和链接器诊断,GFraction 类在命名空间 ged::Mathematichs 内,但在此 .cpp 文件中,您将定义放在命名空间 @987654334 @
猜你喜欢
  • 2015-04-23
  • 2014-04-20
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 2020-08-23
  • 2020-05-06
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多