Я изучаю, как использовать шаблоны классов. Я прочитал несколько примеров, но у меня все еще есть некоторые проблемы.Шаблон класса, определение члена функции
У меня есть следующий класс шаблон в моем заголовке 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()
, компиляция отлично работает.
Невозможно поместить определения функций-членов шаблона класса в файл '.cpp' –
Взгляните на http://stackoverflow.com/questions/610245/where-and-why-do-i-have- to-put-the-template-and-typename-keywords – JoergB
В C++ нет такой вещи, как «классы шаблонов». Это «шаблоны классов» - буквально, шаблоны для создания классов и * не * «классы, которые являются шаблонами». Это небольшое, но важное различие, которое имеет значение при создании шаблонов. –