背景
我有一个名为 PersonLibrary 的项目,它包含两个文件。
- Person.h
- Person.cpp
该库生成一个静态库文件。另一个项目是 TestProject,它使用了 PersonLibrary(通过 VS008 中的项目依赖项添加)。一切都很正常,直到我在 Person.h 中添加了一个非成员函数。 Person.h 的代码如下:
class Person
{
public:
void SetName(const std::string name);
private:
std::string personName_;
};
void SetPersonName(Person& person,const std::string name)
{
person.SetName(name);
}
Person.cpp 定义了 SetName 函数。当我尝试从 TestProject 中使用 SetPersonName 时,出现了 error LNK2005: already defined 错误。以下是我的使用方式:
#include "../PersonLibrary/Person.h"
int main(int argc, char* argv[])
{
Person person;
SetPersonName(person, "Bill");
return 0;
}
已尝试解决方法
1 - 我移除了 Person.cpp 文件,并将整个类定义在 Person.h 中。错误消失,一切正常。
2 - 将 SetPersonName 修改器改为 static。修改后如下:
static void SetPersonName(Person& person,const std::string name)
{
person.SetName(name);
}
问题
- 为什么第一段代码不像我预期的那样运行?
- static 在这里有何不同?
- 这个问题的适当解决方案是什么?
谢谢