C ++ Использование аргумента шаблона класса в качестве аргумента шаблона для другого типа - PullRequest
0 голосов
/ 09 июня 2010

У меня возникла эта проблема при написании собственного 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: ошибка: ожидается`;'before "Iterator"

.. \ main.cpp: в функции-члене `void B :: iterate () ':

.. \ main.cpp: 44: ошибка:` Iterator'не было объявлено в этой области

.. \ main.cpp: 44: ошибка: ожидается `; 'перед "iter"

.. \ main.cpp: 44: ошибка: `iter 'не был объявлен в этой области

Кто-нибудь знает, почему это происходит?Спасибо!

Ответы [ 2 ]

6 голосов
/ 09 июня 2010

Это называется "зависимые имена" в C ++.Во втором фрагменте кода вы говорите:

typedef vector< pair<string, ValueType> >::iterator Iterator;

, тогда как вы должны сказать:

typedef typename vector< pair<string, ValueType> >::iterator Iterator;

Всякий раз, когда вы видите сообщение об ошибке «не получено ...», имя типаспасение.В общем, идея в том, что компилятор не знает, является ли итератор типом или переменной, потому что он не знает, что такое

vector< pair <string, ValueType> >

, поскольку это зависит от ValueType.

(Боюсь, я здесь не использую правильные термины, но идея верна)

0 голосов
/ 09 июня 2010

спасибо, это работает, и теперь все имеет смысл!

И я не хочу использовать typedef, я также могу использовать typename следующим образом:

for( typename list<pair<string, ValueType> >::const_iterator itr = v.begin(); itr != v.end() ; ++itr){
{
//code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...