2011-08-16 178 views
1

這似乎是我的兩個文件,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' 

這裏發生了什麼?

回答

4

在頭文件中,在名稱空間user_interface中聲明函數findFile。在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 "./"; 
    } 
} 
2

你不能實現這樣的findFile;它真的有在命名空間中去:

namespace user_interface 
{ 
    string findFile() 
    { 
     return "./"; 
    } 
} 

or: 

string user_interface::findFile() 
{ 
    return "./"; 
} 

using指令僅用於查詢,而不是定義 - 想象一下using namespace std;會做所有的函數定義,否則!

1

您正在將findFile定義在錯誤的名稱空間中。

要麼

std::string user_interface::findFile() 
{ 
    return "./"; 
} 

namespace user_interface 
{ 
    std::string findFile() 
    { 
     return "./"; 
    } 
} 

using不影響這裏的名字被定義,它不僅影響名稱如何擡起頭來。