我在编写自己的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;
};
Run Code Online (Sandbox Code Playgroud)
这个代码不是:
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;
};
Run Code Online (Sandbox Code Playgroud)
错误消息: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 typeB'
..\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'未在此范围内声明
有人知道为什么会这样吗?谢谢!
这在C++中称为"依赖名称".在您的第二个代码段中,您说:
typedef vector< pair<string, ValueType> >::iterator Iterator;
Run Code Online (Sandbox Code Playgroud)
而你应该说:
typedef typename vector< pair<string, ValueType> >::iterator Iterator;
Run Code Online (Sandbox Code Playgroud)
每当您看到"未导出..."的错误时,请输入typename.一般来说,这个想法是编译器不知道迭代器是一个类型还是一个变量,因为它不知道是什么
vector< pair <string, ValueType> >
Run Code Online (Sandbox Code Playgroud)
是,因为它取决于ValueType.
(害怕我在这里没有使用正确的术语,但这个想法是正确的)