2013-02-14 7 views
1

Я изучаю, как использовать шаблоны классов. Я прочитал несколько примеров, но у меня все еще есть некоторые проблемы.Шаблон класса, определение члена функции

У меня есть следующий класс шаблон в моем заголовке foo.h:

template<typename T> 
class Foo 
{ 
public: 
    bool addKey(const std::string& key); 
    bool addValue(const std::string& key, const T& value); 

private: 
    std::map<std::string, T> mapping; 
}; 

Это файл реализации foo.cpp:

template <typename T> 
bool Foo<T>::addKey(const string& key) 
{ 
    if (key.empty()) 
     return false; 

    pair<map<string, T>::iterator, bool> response; // to store the pair returned by insert() 
    response = mapping.insert(pair<string, T>(key, T())); 

    return response.second; 
} 

Ниже приведены ошибки компиляции (г ++ в KDevelop)

error: type/value mismatch at argument 1 in template parameter list for ‘template<class _T1, class _T2> struct std::pair’ 
error: expected a type, got ‘std::map<std::basic_string<char>, T>::iterator’ 
error: invalid type in declaration before ‘;’ token 
error: request for member ‘second’ in ‘response’, which is of non-class type ‘int’ 

Таким образом, это выглядит как std::pair не может иметь дело с T типа?

Если не удалось найти std::pair, но отказано insert(), компиляция отлично работает.

+2

Невозможно поместить определения функций-членов шаблона класса в файл '.cpp' –

+2

Взгляните на http://stackoverflow.com/questions/610245/where-and-why-do-i-have- to-put-the-template-and-typename-keywords – JoergB

+2

В C++ нет такой вещи, как «классы шаблонов». Это «шаблоны классов» - буквально, шаблоны для создания классов и * не * «классы, которые являются шаблонами». Это небольшое, но важное различие, которое имеет значение при создании шаблонов. –

ответ

3

В этом случае iterator является зависимым именем, вы должны квалифицировать его с typename ключевым словом:

pair<typename map<string, T>::iterator, bool> 

См this question для более подробной информации.

+0

А также см. [этот вопрос] (http:// /stackoverflow.com/questions/14843006/error-lnk2019unresolved-external-symb ol-c/14843056 # 14843056) о поведении определений функций члена шаблона класса в файле '.cpp'. –

+0

@AndyProwl: Может быть, OP намерен включить его .cpp-файл вместе с файлом .h в любом месте, где он использует шаблон :) –

1

Попробуйте написать пару < typename map :: итератор. Итератор - это тип, зависящий от параметра шаблона, и компилятор нуждается в некоторой помощи для его распознавания.

+1

@Armen уже отправил его ранее в своем ответе, что еще раз повторяет его, если он не содержит что-нибудь новое? , – M3taSpl0it

+0

@ M3taSpl0it Этот ответ объясняет, что такое «зависимое имя». – Angew

+1

@Angew Я считаю, что другой ответ уже отправил ссылку на то, что уже объяснено. – M3taSpl0it

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