2015-04-14 6 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 файл должен включать все необходимые заголовки. Кроме того, он должен содержать [включить охранников] (http://en.wikipedia.org/wiki/Include_guard). – n0rd

ответ

5

using namespace std; используется в CPP файле, но не в заголовке (и не использовать его в заголовке), так что вы должны использовать полностью квалифицированные имена типов:

#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

Это, в основном, образованное предположение, поскольку вы не опубликовали фактическую ошибку и весь код.

Вам не хватает std:: перед каждым именем класса STL, так как вы не должны использовать инструкцию using в заголовочных файлах.

Пример: std::map <char, char> create(std::vector <char> &one, std::vector <char> &two);

Также убедитесь, что у вас есть надлежащее включать заявление в верхней части заголовка файла (<vector>, и т.д. ...).

+0

Спасибо, но не являются ли эти # #include избыточными, если они добавлены в заголовок? Похоже, они не нужны для работы. Я имею в виду include для контейнеров – VVG

+1

В вашем случае это * выглядит * избыточным, потому что вы добавляете 'Header.h' после' ', ... в ваш файл cpp, чтобы компилятор знал эти классы при чтении вашего файла заголовка. Но если вы впервые включили 'Header.h', он не был бы скомпилирован. – Hiura

+1

@VVG, .h файл должен использоваться самостоятельно. Если вы не включаете заголовки контейнеров, вы становитесь зависимыми от порядка '# include' в вашем .cpp-файле. – n0rd

Смежные вопросы