好像我的两个文件userinterface.h
#ifndef USERINTERFACE_H
#define USERINTERFACE_H
#include <string>
#include "vocabcollection.h"
namespace user_interface
{
//Finds a file
//
//Returns when user selects a file
std::string findFile();
//more comments followed by functions
}
#endif
和userinterface.cpp,
#include "userinterface.h"
using namespace std;
using namespace user_interface;
string findFile()
{
return "./";
}
//more placeholder implementations of such functions; void functions have nothing within
//the brackets
给了我链接器的这一系列错误:
Undefined symbols for architecture x86_64:
make: Leaving directory `longdirectorypath'
"user_interface::showTestResults(int, int)", referenced from:
vocabCollection::test() in vocabcollection.o
"user_interface::get(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
addNewCollection() in mainlogic.o
loadNewCollection() in mainlogic.o
"user_interface::findFile()", referenced from:
loadNewCollection() in mainlogic.o
"user_interface::displayMainMenu(std::vector<vocabCollection, std::allocator<vocabCollection> >)", referenced from:
mainlogic() in mainlogic.o
"user_interface::getUserAction()", referenced from:
mainlogic() in mainlogic.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [cheapassVocab.app/Contents/MacOS/cheapassVocab] Error 1
The process "/usr/bin/make" exited with code 2.
Error while building project cheapassVocab (target: Desktop)
When executing build step 'Make'
这里发生了什么?
答案 0 :(得分:4)
在头文件中,您在名称空间findFile
中声明函数user_interface
。在cpp文件中定义了自由函数 findFile
。是的,您是using namespace user_interface
,但编译器不知道那里定义的findFile
属于namespace user_interface
。所有这一切的结果是您已声明user_interface::findFile
并定义::findFile
。当你调用user_interface::findFile
时,链接器找不到它,因为只有自由函数findFile
。
轻松解决 - cpp文件:
#include "userinterface.h"
using namespace std;
namespace user_interface
{
string findFile()
{
return "./";
}
}
答案 1 :(得分:2)
你无法像那样实施findFile
;它真的必须进入命名空间:
namespace user_interface
{
string findFile()
{
return "./";
}
}
or:
string user_interface::findFile()
{
return "./";
}
using
指令仅用于查找,而不用于定义 - 想象一下using namespace std;
对你的所有函数定义会做什么!
答案 2 :(得分:1)
您正在错误的命名空间中定义findFile。
无论
std::string user_interface::findFile()
{
return "./";
}
或
namespace user_interface
{
std::string findFile()
{
return "./";
}
}
using
不会影响名称的定义,只影响名称的查找方式。