我有一个模板类,我在其中专门研究几种方法。出于某种原因,当我为结构添加特化时,它似乎与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>
。
有什么想法吗?
答案 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>;