2009-06-26 159 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

謝謝,它的工作:) – 2009-06-26 06:51:59

8

納文的答案是正確的,我可以添加一個建議:我使用廣泛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); 
} 
+0

+1肯定會更容易閱讀代碼 – Naveen 2009-06-26 07:16:47