【发布时间】:2010-10-11 22:56:16
【问题描述】:
背景
我有一个名为 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);
}
问题
- 为什么首先显示的代码没有按我的预期工作?
- 静态在这里做了什么?
- 此问题的适当解决方案是什么?
谢谢
【问题讨论】: