背景
我有一个名为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时,我收到错误LNK2005:已定义.这是我如何使用它
#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); }
问题
为什么首先显示的代码不能按预期工作?
静态在这里有什么区别?
这个问题的解决方案是什么?
谢谢
你要么必须
将SetPersonName
定义移动到.cpp文件,编译并链接到生成的目标
制作SetPersonName
内联
这是一个众所周知的违反一个定义规则的案例.
static关键字使函数的链接在内部,即只对它所包含的翻译单元可用.但是这隐藏了真正的问题.我建议将函数的定义移动到它自己的实现文件中,但是在头文件中保留声明.