2013-02-14 148 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; 
} 

以下是编译错误(G ++中的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类型?

如果我不保存由insert()返回的std::pair,则编译工作正常。

+2

您不能将类模板的成员函数的定义放在'.cpp'文件中 – 2013-02-14 14:19:34

+2

看看http://stackoverflow.com/questions/610245/where-and-why-do-i-have- to-put-the-template-and-typename-keywords – JoergB 2013-02-14 14:21:25

+2

在C++中没有“模板类”这样的事情。他们是“类模板” - 从字面上看,用于制作类的模板和* not *“模板化的类”。这是一个小而重要的区别,在实例化模板时很重要。 – 2013-02-14 14:21:29

回答

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'文件。 – 2013-02-14 14:21:30

+0

@AndyProwl:也许OP打算将他的.cpp文件和.h文件一起包含到他使用模板的任何地方:) – 2013-02-14 14:23:18

1

试着写对< typename map :: iterator。迭代器是一个取决于模板参数的类型,编译器需要一些帮助来识别它。

+1

@Armen早些时候已经在他的答案中发布了它,如果它不包含有什么新事吗? 。 – M3taSpl0it 2013-02-14 14:23:56

+0

@ M3taSpl0it这个答案解释了“依赖名称”是什么。 – Angew 2013-02-14 14:31:41

+1

@Angew我相信其他答案已经发布了已经解释过的链接。 – M3taSpl0it 2013-02-14 14:34:36

相关问题