【问题标题】:template specialization compiler error模板专业化编译器错误
【发布时间】:2018-02-12 02:36:24
【问题描述】:

我有一个 main.cpp 和一个名为 bar.h 的头文件 这是main.cpp。我的目标是让程序打印出“bar”:

#include "bar.h"

struct Raw{
};

template<typename Obj>
struct IsBar{
    static const bool value = false;
};

template<typename Obj, bool>
struct function{
    static void callbar(Obj obj){ 
        obj.bar();
    }; 
};

template<typename Obj>
struct function<Obj, false>{
    static void callbar(Obj obj){ 
        std::cout<< "no bar()" << std::endl;
    }; 
};

int main()
{
    typedef Bar<Raw> Obj;
    Obj obj;

    function<Obj, IsBar<Obj>::value> f;
    f.callbar(obj); 

    return 0;
}

对于 bar.h:

template<typename T>
struct Bar{
    void bar()
    {
        std::cout<< "bar" << std::endl;
    };
};

template<>
struct IsBar<Bar>{ // I know this wouldn't work, but how do I do something like Bar<Raw> instead of just Bar?
    static const bool value = true;
};

编译器给了我这个错误:错误:'IsBar' 不是类模板。 以前我尝试在 main.cpp 中包含 bar.h 的内容,一切正常,因为当我使用 Bar&lt;Raw&gt; 声明 IsBar&lt;&gt; 专业化时,Raw 是已知的。

【问题讨论】:

  • 模板必须在特化之前定义。
  • 当然你可以使用template&lt;&gt; struct IsBar&lt;Bar&lt;Raw&gt;&gt;,甚至template&lt;typename T&gt; struct IsBar&lt;Bar&lt;T&gt;&gt;,但是当你添加专业化时,主模板必须是可见的。

标签: c++ templates metaprogramming template-specialization


【解决方案1】:

你想要partial specialization,例如

template<typename T>
struct IsBar<Bar<T>> {
    static const bool value = true;
};

这意味着对于Bar&lt;T&gt; 的所有实例化,IsBar&lt;Bar&lt;T&gt;&gt;::valuetrue

注意主模板应该在特化之前声明;我认为您应该将IsBar 的主要模板定义从main.cpp 移动到bar.h

LIVE

【讨论】:

  • 我仍然遇到同样的错误,说错误:'IsBar' 不是类模板
  • @user1701840 答案已修改。
猜你喜欢
  • 2011-03-05
  • 2018-06-22
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2011-12-22
  • 2020-07-18
相关资源
最近更新 更多