2011-08-25 46 views
8

Tôi đang gặp sự cố với khai báo phương thức cho mẫu lớp lồng nhau. Tôi có một cái gì đó như thế này:C++ Nested Template Class Method Issue

template <typename T> 
class HashTrie 
{ 
    template <typename Y> 
    class Entry 
    { // members and methods here 
    }; 

    template <typename U> 
    class Node 
    { // members and methods here 
    }; 

    // members and methods here 
} 

Sau đây dường như làm việc mà không có một vấn đề:

template <typename T> 
template <typename Y> 
HashTrie<T>::Entry<Y> HashTrie<T>::Entry<Y>::someMethod() { 
    //... 
} 

Tuy nhiên, đây không:

template <typename T> 
template <typename U> 
std::map<char, HashTrie<T>::Node<U> > HashTrie<T>::Node<U>::anotherMethod() { 
// ... 
} 

tôi nhận được lỗi sau trên GCC

./HashTrie.h:389: error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’ 
./HashTrie.h:389: error: expected a type, got ‘(HashTrie::Node < <expression error>)’ 
./HashTrie.h:389: error: template argument 4 is invalid 
./HashTrie.h:389: error: expected unqualified-id before ‘>’ token 

Tôi đã cố gắng thêm một typename, nhưng điều đó dường như không giúp

template <typename T> 
template <typename U> 
std::map<char, typename HashTrie<T>::Node<U> > HashTrie<T>::Node<U>::anotherMethod() { 
// ... 
} 

kết quả trong ...

./HashTrie.h:389: error: template argument 2 is invalid 
./HashTrie.h:389: error: template argument 4 is invalid 
./HashTrie.h:389: error: expected unqualified-id before ‘>’ token 

ICPC nói:

./HashTrie.h(389): error: template parameter "HashTrie<T>::Node [with T=T]" may not have a template argument list 
    std::map<char, typename HashTrie<T>::Node<U> > HashTrie<T>::Node<U>::newNodeMap() { 

Tôi không thực sự chắc chắn phải làm gì ở đây và gặp khó khăn trong việc tìm ra bất kỳ vấn đề tương tự nào trên web. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

7

nói này:

template <typename T> 
template <typename U> 
std::map<char, typename HashTrie<T>::template Node<U> > HashTrie<T>::Node<U>::foo() 
{ 
} 
+0

Cảm ơn bạn rất nhiều! – Dan