【问题标题】:Cannot specialize fnc无法专门化 fnc
【发布时间】: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


【解决方案1】:

您没有给出足够的代码来确定,但我怀疑问题是您在尝试调用 get_root 时没有定义 Node,因此编译器无法识别 Node_T::node_ptr。另一个问题似乎是 get_root 在声明之前调用了 get_root_hlp。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多