2015-04-14 79 views
0

我很新的概念分裂程序header等概念,通常,它會好的,但在這種情況下,如果我嘗試下一步我有一大堆的錯誤:函數聲明STL在頭C++

假設我有一個.cpp文件:

#include <iostream> 
#include <string> 
#include <map> 
#include <algorithm> 
#include <vector> 
#include "Header.h" 
using namespace std; 

int main() { 
    //some code here 
} 

map <char, char> create(vector <char> &one, vector <char> &two) { 
    //some code here 
} 

vector <char> conc(string phrase) { 
    // some code here 
} 

vector <char> result(vector<char> three, map <char, char> code) { 
    // some code here 
} 

Header.h我:

map <char, char> create(vector <char> &one, vector <char> &two); 
vector <char> conc(string phrase); 
vector <char> result(vector<char> three, map <char, char> code); 

這只是函數聲明..如果我把他們的.cpp程序作品很好,但是如果在Header.h中 - 它不會。你能告訴我在這裏錯過了什麼嗎?

我在閱讀有關在cprogramming.com上拆分的概念,但他們從來沒有用STL做過例子。謝謝!

+3

.h文件中應包括所有必要的頭文件。另外,它應該包含[include guard](http://en.wikipedia.org/wiki/Include_guard)。 – n0rd

回答

5

您在CPP文件中使用using namespace std;,但不是在頭(不要在標題使用它),所以你應該使用完全限定的類型名稱:

#ifndef HEADER_H 
#define HEADER_H 

#include <string> 
#include <map> 
#include <vector> 

std::map <char, char> create(std::vector <char> &one, std::vector <char> &two); 
std::vector <char> conc(std::string phrase); 
std::vector <char> result(std::vector<char> three, std::map <char, char> code); 

#endif // HEADER_H 
2

這主要是一個受過教育的猜測,因爲你沒有發佈實際的錯誤,也沒有發佈整個代碼。

由於不應在頭文件中使用using語句,因此在每個STL類名稱之前缺少std::

例子: std::map <char, char> create(std::vector <char> &one, std::vector <char> &two);

另外,還要確保你有適當的包括在聲明頭文件(<vector>等)的頂部。

+0

謝謝,但不是這些'#include'冗餘如果添加到標題?看起來他們不需要工作。我的意思是包含容器 – VVG

+1

在你的情況下,它看起來很多,因爲你在你的cpp文件中包含'',...之後的'Header.h',所以編譯器在閱讀你的頭文件時知道這些類。但是如果你第一次包含'Header.h',它不會被編譯。 – Hiura

+1

@VVG,.h文件必須可以自行使用。如果您不包含容器標題,則您將依賴於.cpp文件中'#include'的順序。 – n0rd