我正在使用Visual Studio 2015开发C ++解决方案。
我有一个带有此声明的cpp源文件和头文件hpp。
部首:
#ifndef MyLib__FREEFUNCTIONS__INCLUDE__
#define MyLib__FREEFUNCTIONS__INCLUDE__
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
// Check if 'str' is null, empty or consists only of white-space characters.
inline bool IsNullOrWhiteSpace(string str);
// More functions
[ ... ]
#endif
和源代码:
#include "FreeFunctions.h"
inline bool IsNullOrWhiteSpace(string str)
{
return (str.empty() || (str.find_first_not_of(' ') == string::npos));
}
我在课堂上使用这个功能:
#include "ConvertToOwnFormat.h"
#include "FreeFunctions.h"
ConvertToOwnFormat::ConvertToOwnFormat()
{
}
ConvertToOwnFormat::~ConvertToOwnFormat()
{
}
vector<Entry> ConvertToOwnFormat::ReadCatalogue(string path)
{
if (!IsNullOrWhiteSpace(path)
{
[ ... ]
}
}
我在ConvertToOwnFormat::ReadCatalogue
中收到以下错误:
错误LNK2019外部符号“bool __cdecl IsNullOrWhiteSpace(类 的std :: basic_string的,类 std :: allocator&gt;)“ (?IsNullOrWhiteSpace @@ YA_NV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@@ Z) 函数“public:class std :: vector&gt; __cdecl”引用的未解析 ConvertToOwnFormat :: ReadCatalogue(class std :: basic_string,class std :: allocator&gt;)“ (?ReadCatalogue @ @@ ConvertToOwnFormat QEAA?AV?$矢量@ @@距离Ventry V'$分配器@距离Ventry @@@ STD @@@ STD @@ V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V· $ allocator @ D @ 2 @@ 3 @@ Z)MyProjectLib D:\ Fuentes \ Repos \ MyProject \ MyProjectLibConsoleTest \ ConsoleMyProjectLib \ Lib.lib(ConvertToOwnFormat.obj)1
答案 0 :(得分:4)
您必须在标头中放置方法声明。 inline
告诉编译器它应该用函数的核心替换函数的调用。因此,它需要在编译时为每个使用它的编译单元
#ifndef MyLib__FREEFUNCTIONS__INCLUDE__
#define MyLib__FREEFUNCTIONS__INCLUDE__
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
// Check if 'str' is null, empty or consists only of white-space characters.
inline bool IsNullOrWhiteSpace(std::string str)
{
return (str.empty() || (str.find_first_not_of(' ') == std::string::npos));
}
// Others functions, prototype, ...
#endif
或删除源文件和头文件中的inline
它完全脱离主题,但从不在标题中放置using namespace
:标题应该提供一些内容,但不应强加类似命名空间的内容。另请参阅"using namespace" in c++ headers