2016-01-07 167 views
0

这似乎是重复的。相反,我试着在StackOverflow上找到类似的问题,但我无法解决链接器错误。“无法解析的外部符号public _thiscall”链接器错误调用构造函数和析构函数

这些是链接错误:

1.

LNK2001解析的外部符号 “公共:__thiscall GED :: Mathematichs :: GFraction ::〜GFraction(无效)”(?? 1GFraction @ Mathematichs @ @@ GED QAE @ XZ)

和2

LNK2001解析的外部符号 “公共:__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() {} 

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

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

+0

其中的分数和denomatior从GFraction类? – val

+0

@val它们是私有变量。我没有在这里写他们,不要让这个混淆 – Michele

回答

1

在你.cpp文件using -directive:

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 

把定义在同一个命名空间的声明。

+0

在。cpp他使用包含该类的名称空间的using-directive。我也想实现这一点 – Michele

+0

我不会猜测:我告诉你你的代码有什么问题。 你连接的'Array.cpp'也是错误的(我恐怕这是 是垃圾)。 –

+0

我做了的.cpp如你所说的,但我得到这些错误:http://prntscr.com/9na25y – Michele

相关问题