这似乎是重复的。相反,我试图在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文件中!
答案 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
将定义放在与声明相同的名称空间中。