代码之家  ›  专栏  ›  技术社区  ›  Shino C G

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

  •  3
  • Shino C G  · 技术社区  · 17 年前
    #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 回复  |  直到 17 年前
        1
  •  8
  •   ugasoft    17 年前

    Naveen的答案是正确的,我可以添加一个建议:我广泛使用typedef,我正在等待模板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);
    }
    
        2
  •  6
  •   Naveen    17 年前

    返回值中再次缺少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);
    }