如何在类声明之外声明模板函数

时间:2009-06-26 06:40:41

标签: c++ visual-studio-2008 templates

#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 个答案:

答案 0 :(得分:8)

Naveen的答案是正确的,我可以添加一个建议:我使用了大量的typedef,我正在等待模板typedef和“true type definition”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);
}

答案 1 :(得分:6)

您再次错过了返回值中的typename。功能应该是:

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);
}