【发布时间】:2011-08-03 10:07:29
【问题描述】:
拥有这些:
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 &)'
知道为什么吗?
【问题讨论】:
-
错误出现在哪一行?哪个代码
get_root()是专门的? -
该错误信息似乎与代码不一致。在代码中 get_root() 不返回 Node_T&,而是返回 Node_T::node_ptr&。可能编译器在您用作 get_root 的 Node_T 参数的类型中看不到 node_ptr。
-
请提供完整的测试用例,代码不完整。至少 IsNode 是此处未显示的模板的特化。我也看不到编译器可能抱怨的任何尝试的 get_root 特化。
标签: c++ metaprogramming