模板特化编译器错误

时间:2018-02-12 02:36:25

标签: c++ templates metaprogramming template-specialization

我有一个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的内容,一切正常,因为当我使用IsBar<>声明Bar<Raw>特化时,Raw就知道了。

1 个答案:

答案 0 :(得分:2)

您需要partial specialization,例如

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

这意味着Bar<T>的所有实例化,IsBar<Bar<T>>::value都是true

请注意,主模板应在专门化之前声明;我认为您应该将IsBar的主要模板定义从main.cpp移至bar.h

LIVE