C++使用类模板参数作为另一种类型的模板参数

Chr*_*phe 0 c++ templates

我在编写自己的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'未在此范围内声明

有人知道为什么会这样吗?谢谢!

iks*_*nov 6

这在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.

(害怕我在这里没有使用正确的术语,但这个想法是正确的)