Как мне объявить функцию шаблона вне объявления класса - PullRequest
3 голосов
/ 26 июня 2009
#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);
}

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

Ответы [ 2 ]

8 голосов
/ 26 июня 2009

Ответ Навина правильный, я могу добавить предложение: я широко использую typedefs и жду шаблона typedef и "истинного определения типа" typedef.

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);
}
6 голосов
/ 26 июня 2009

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...