我有一个帮助类,用于向另一个类提供部分专用的方法版本。我有主要模板和两个专业:
template<typename BASE, typename ACCESS_METHOD, int MODULE>
struct BaseHelper
{
void f1()
{
....
}
}
template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
void f1()
{
....
}
}
template<typename BASE, int MODULE>
struct BaseHelper< BASE, uint32_t, MODULE >
{
void f1()
{
....
}
}
如果执行以下操作:
FpgaBaseHelper< SomeBaseClass, AccessMethod, 1 > helper1;
FpgaBaseHelper< SomeBaseClass, StrangeAccessMethod<MyDevice>, 2> helper2;
FpgaBaseHelper< SomeBaseClass, uint32_t, 3 > helper3;
然后结果是主模板被实例化为helper1和helper2,第三个实例化了uint32_t特化。
我需要helper2才能使用StrangeAccessMethod&lt;&gt;专业化。
我做错了什么?
答案 0 :(得分:1)
符号:
template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
}
不正确。它指的是未在主模板中定义的嵌套模板。很可能编译器在许多其他模板中没有说任何东西。
多个模板标题只能用于以下情况:
template<typename BASE, int MODULE> struct BaseHelper
{
template<typename DEVICE> struct InnerTemplate; // This is forward declaration.
}
template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper<BASE, MODULE>::InnerTemplate
{
// Definition.
}
您可以尝试:
template<typename BASE, int MODULE, typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
}
也许它会起作用。