c++ - 模板特化编译器错误

标签 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”不是类模板。 之前我尝试将 bar.h 的内容放入 main.cpp 中,一切正常,因为当我声明 IsBar<> 时,Raw 是已知的。特化使用 Bar<Raw> .

最佳答案

你想要partial specialization ,例如

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

这意味着 Bar<T> 的所有实例化, IsBar<Bar<T>>::valuetrue .

请注意,主模板应在特化之前声明;我认为您应该移动 IsBar 的主模板定义来自main.cppbar.h .

LIVE

关于c++ - 模板特化编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48738810/

相关文章:

c++ - 实现涉及 Windows HANDLE 对象的复制构造函数

c++ - 模板参数、#define 和代码重复

ruby - 动态添加 ruby​​ 类方法或实例方法

ruby - 为什么一些未定义的方法(例如 Foo)没有被 `method_missing` 捕获?

ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)?

c++ - cout << a++ << a;的正确答案是什么?

c++ - 编译三角形交集代码?

c++ - 为什么删除复制构造函数时默认初始化会失败?

c++ - 当 C++ 中也有非模板函数时,调用专门的模板函数

node.js - 如何将 meteor 助手存储在 mongoDB 集合中,以及如何从 mongoDB 集合中呈现它