2011-08-03 40 views
2

有那些:不能專注FNC

template<class T> 
struct Is_Node 
{ 
    enum {value = false}; 
}; 

template<class Key_T, class Value_T> 
class Node;//frwd decl. 

template<class K,class V> 
struct Is_Node<Node<K,V>> 
{ 
    enum {value = true}; 
}; 

enum Tags {tree_tag,node_tag,root_tag,parent_tag,left_tag,right_tag,key_tag,value_tag,color_tag}; 

template<Tags> 
struct Tag_2_Type 
{/*eb*/}; 

template<class Node_T> 
typename Node_T::node_ptr& get_root(Node_T& node) 
{ 
    return get_root_hlp(node,Tag_2_Type<Is_Node<Node_T>::value>()); 
} 

template<class Node_T> 
typename Node_T::node_ptr& get_root_hlp(Node_T& node,Tag_2_Type<node_tag>) 
{ 
    return node->root_; 
} 

template<class Node_T> 
typename Node_T::node_ptr& get_root_hlp(Node_T& node,Tag_2_Type<tree_tag>) 
{ 
    return node->root_; 
} 

我收到提示:
錯誤C2893:無法專注函數模板 'Node_T & get_root(Node_T &)'

任何想法,爲什麼?

+0

哪一行錯誤即將到來?哪個代碼是'get_root()'是專門的? – iammilind

+0

該錯誤消息似乎與代碼不一致。在代碼中,get_root()不返回Node_T&,但是Node_T :: node_ptr&。可能編譯器在您用作get_root的Node_T參數的類型中看不到node_ptr。 – imre

+1

請提供完整的測試用例,代碼不完整。至少IsNode是一個沒有在那裏顯示的模板的專業化。另外,我看不到任何有關編譯器可能會抱怨的get_root專門化的嘗試。 – PlasmaHH

回答

0

您還沒有給出足夠的代碼來確定,但我懷疑問題在於您嘗試調用get_root時未定義Node,因此編譯器無法識別Node_T :: node_ptr。另一個問題似乎是get_root在聲明之前調用get_root_hlp。