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

时间:2010-06-09 10:04:42

标签: 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;
};

此代码不会:

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'未在此范围内声明

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

2 个答案:

答案 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
}