我今天遇到了一个我不完全理解的行为。我直接进入一个最小的代码示例,并将一路解释。
我有2个项目:静态c ++库和控制台应用程序。
静态Lib项目:
Library.h
#pragma once
namespace foo
{
int testFunc();
class StaticLibClass
{
public:
static int testMemberFunc();
};
}
Library.cpp
#include "Library.h"
using namespace foo;
// just some functions that don't do much
int testFunc()
{
return 10;
}
int StaticLibClass::testMemberFunc()
{
return 11;
}
控制台应用项目:
的main.cpp
#include "library.h"
using namespace foo;
void main()
{
// calling this function reslts in LNK2019: unresolved external symbol...
testFunc();
// this function works just fine
StaticLibClass::testMemberFunc();
}
正如您所看到的,类的静态成员函数运行正常。但是单个testFunc会导致链接器错误。这是为什么?
该问题的解决方案是不在Library.cpp文件中使用“using”,而是将其包装在命名空间中,如下所示:
解决问题的更改:
Library.cpp
#include "Library.h"
namespace foo
{
// just some functions that don't do much
int testFunc()
{
return 10;
}
int StaticLibClass::testMemberFunc()
{
return 11;
}
}
答案 0 :(得分:4)
您需要将实现函数/方法的主体包装在与原始标头匹配的名称空间语句中,或者您可以使用完全限定的名称,这可能是更好的C ++样式:
#include "Library.h"
// just some functions that don't do much
int foo::testFunc()
{
return 10;
}
int foo::StaticLibClass::testMemberFunc()
{
return 11;
}
你不需要使用名称空间foo;在这个版本中。你已经在命名空间中了#foo'在实现这两种方法的主体时,根据该命名空间中的其他类型可以很方便。