我在编写自己的HashTable时遇到了这个问题。这一切都有效,但当我试图模仿这件事时,它给了我错误。我按如下方式重新创建了问题:
此代码的工作原理:
typedef double Item;
class A
{
public:
A()
{
v.push_back(pair<string, Item>("hey", 5.0));
}
void iterate()
{
for(Iterator iter = v.begin(); iter != v.end(); ++iter)
cout << iter->first << ", " << iter->second << endl;
}
private:
vector<pair<string, double> > v;
typedef vector< pair<string, double> >::iterator Iterator;
};
此代码不会:
template<typename ValueType>
class B
{
public:
B(){}
void iterate()
{
for(Iterator iter = v.begin(); iter != v.end(); ++iter)
cout << iter->first << ", " << iter->second << endl;
}
private:
vector<pair<string, ValueType> > v;
typedef vector< pair<string, ValueType> >::iterator Iterator;
};
错误消息: g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -omain.o .. \ main.cpp
.. \ main.cpp:50:错误:输入std::vector<std::pair<std::string, ValueType>, std::allocator<std::pair<std::string, ValueType> > >' is not derived from type
B'
.. \ main.cpp:50:错误:ISO C ++禁止声明`iterator'没有类型
.. \ main.cpp:50:错误:预期`;'在“Iterator”之前
.. \ main.cpp:在成员函数`void B :: iterate()':
中.. \ main.cpp:44:错误:未在此范围内声明`Iterator'
.. \ main.cpp:44:错误:预期`;'在“iter”之前
.. \ main.cpp:44:错误:`iter'未在此范围内声明
有人知道为什么会这样吗?谢谢!
答案 0 :(得分:6)
这在C ++中称为“依赖名称”。在您的第二个代码段中,您说:
typedef vector< pair<string, ValueType> >::iterator Iterator;
而你应该说:
typedef typename vector< pair<string, ValueType> >::iterator Iterator;
每当您看到“未派生......”的错误时,请输入typename。 一般来说,这个想法是编译器不知道迭代器是一个类型还是一个变量,因为它不知道是什么
vector< pair <string, ValueType> >
,因为它取决于ValueType。
(害怕我这里没有使用正确的术语,但这个想法是正确的)
答案 1 :(得分:0)
感谢它有效,现在一切都有意义!
我不想使用typedef,我也可以使用这样的typename:
for( typename list<pair<string, ValueType> >::const_iterator itr = v.begin(); itr != v.end() ; ++itr){
{
//code
}