我有以下程序工作正常。但是一旦我摆脱了 bar.h 中主要专业化的前向声明。我收到编译错误,说专业化不是类模板。为什么?
bar.h:
template<typename T>
struct Bar{
void bar()
{
std::cout<< "bar" << std::endl;
};
};
//template<typename T> // Looks like I need to forward declare this in order to have it compile and work, why?
//struct IsBar;
template<typename T>
struct IsBar<Bar<T>> {
static const bool value = true;
};
main.cpp:
#include "bar.h"
struct Raw{
};
template<typename T>
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;
}
这是因为
template<typename T>
struct IsBar<Bar<T>> {
static const bool value = true;
};
是一个模板特模板的IsBar<U>
用于U
= Bar<T>
。为了特化 a template
,您必须首先声明通用的非特化模板。
此外,为了使其正常工作(例如在 SFINAE 中),您希望通用版本包含value=false
:
template<typename T>
struct IsBar
: std::integral_constant<bool,false>
{};
template<typename T>
struct IsBar<Bar<T>>
: std::integral_constant<bool,true>
{};
由于此功能与 密切相关struct Bar<>
,因此应在与 相同的头文件中定义它struct Bar<>
,即在您的情况下是 bar.h。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句