"未解决的外部符号public _thiscall"调用构造函数和析构函数

时间:2016-01-07 18:50:55

标签: linker

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

这些是链接器错误:

1

  

LNK2001未解析的外部符号" public:__ thishisall ged :: Mathematichs :: GFraction :: ~GFraction(void)" (?? 1GFraction @ Mathematichs @ @@ GED QAE @ XZ)

和2。

  

LNK2001未解析的外部符号" public:__ thishisall 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文件中!

1 个答案:

答案 0 :(得分: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

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