使用struct和bool进行模板专业化

时间:2010-07-21 00:01:20

标签: c++ templates

我有一个模板类,我在其中专门研究几种方法。出于某种原因,当我为结构添加特化时,它似乎与bool的特化相矛盾。我收到类型转换错误,因为它试图设置struct = bool(解析为错误的特化)。这是一些代码

·H:

typedef struct foo {
  ...
}

template <class T> class bar {
   template <class T> void method1() {...}
   template <> void method1<bool>() {...}
   template <> void method1<foo>() {...}
}

的.cpp

 template class bar<bool>;
 template class bar<foo>;

我在method1<bool>内收到错误,因为它设置了T = foo而不是将其解析为method1<foo>

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

代码的第一部分已经不正确了。 C ++不支持“嵌套”(成员)模板的显式特化,而不包含封闭模板的显式特化。

在代码的上下文中,明确地专门化模板方法method1而不明确专门化整个类模板bar是非法的。

如果您的成员模板函数member1依赖于某些参数,则可以使用重载而不是模板特化作为变通方法。但由于它没有,你必须以某种方式重新设计模板。你在C ++上再次做的是非法的。

你进一步失误的错误很容易(并且很可能是)由原始问题引起。

P.S。您发布的问题的描述意味着您的代码编译。由于上述原因,您发布的内容不应编译。这表明您发布了假代码。发布实际代码。

答案 1 :(得分:1)

(已编辑)

您可以尝试以下方法,将方法实现委托给模板化助手类。

·H:

typedef struct Foo {
  ...
}

template<class T_Bar, class T2> struct BarMethod1;
template <class T> class Bar 
{
   template<class T2> void method1(...)
   {
      BarMethod1<Bar, T2>(...)(...);
   }
}
template <class T_Bar, class T2> class BarMethod1 
   {void operator()(...){...}};
template <class T_Bar> class BarMethod1<T_Bar, bool>
   {void operator()(...){...}};

template <class T_Bar> BarMethod1<T_Bar, Foo>
   {void operator()(...){...}};

的.cpp

 template class Bar<bool>;
 template class BarMethod1<Bar<bool>, bool>;
 template class BarMethod1<Bar<bool>, Foo>;
 template class Bar<Foo>;
 template class BarMethod1<Bar<Foo>, bool>;
 template class BarMethod1<Bar<Foo>, Foo>;