模板专业化编译器错误
template specialization compiler error
我有一个 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' 不是 class 模板。
以前我试图在 main.cpp 中包含 bar.h 的内容,并且一切正常,因为当我使用 Bar<Raw>
.[=14 声明 IsBar<>
专业化时,Raw 是已知的=]
你想要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
.
我有一个 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' 不是 class 模板。
以前我试图在 main.cpp 中包含 bar.h 的内容,并且一切正常,因为当我使用 Bar<Raw>
.[=14 声明 IsBar<>
专业化时,Raw 是已知的=]
你想要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
.