2009-06-26 2 views
3
#include <iterator> 
#include <map> 
#include <vector> 

template <class T1, class T2> 
class A 
{ 
public: 

    typedef typename std::vector<std::pair<T1,T2> >::iterator iterator; 

    std::pair<iterator, bool > foo() 
    { 
     iterator aIter; 
     return std::pair<std::vector<std::pair<T1,T2> >::iterator, bool >(aIter ,false); 
    } 
}; 

Приведенный выше код отлично подходит для меня. Но я хочу переместить определение функции вне объявления класса. Я попробовал это.Как объявить функцию шаблона вне декларации класса

template <class T1, class T2> 
class A 
{ 
public: 

    typedef typename std::vector<std::pair<T1,T2> >::iterator iterator; 

    std::pair<iterator, bool > foo(); 
}; 

template <class T1, class T2> 
std::pair<std::vector<std::pair<T1,T2> >::iterator, bool > A<T1, T2>::foo() 
{ 
    iterator aIter; 
    return std::pair<std::vector<std::pair<T1,T2> >::iterator, bool >(aIter ,false); 
} 

Но он не компилируется. Есть идеи как это сделать?

ответ

6

У вас снова отсутствует имя типа в возвращаемом значении. Функция должна быть:

template <class T1, class T2> 
std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool > A<T1, T2>::foo() 
{ 
    iterator aIter; 
    return std::pair<std::vector<std::pair<T1,T2> >::iterator, bool >(aIter ,false); 
} 
+0

Спасибо, это сработало :) –

8

Ответ Навин является правильным, я могу добавить предложение: Я использую широко и определение типов я жду шаблона ЬурейиЙ и «истинное определение типа» ЬурейиЙ.

template <class T1, class T2> 
class A 
{ 
public: 
    typedef typename std::vector<std::pair<T1,T2> >::iterator iterator; 
    typedef std::pair<iterator, bool > MyPair; 
    MyPair foo(); 
}; 

template <class T1, class T2> 
typename A<T1,T2>::MyPair A<T1, T2>::foo() 
{ 
    iterator aIter; 
    return MyPair(aIter ,false); 
} 
+0

+1, конечно, значительно упрощает чтение кода – Naveen

Смежные вопросы