C++编译器忽略具有模板化类型的类专用化

C++ Compiler ignoring class specialization with templatized type

本文关键字:类型 专用 编译器 C++      更新时间:2023-10-16

我有一个助手类,用于向另一个类提供部分专用的方法版本。我有主要的模板和两个专业:

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<>专业化

我做错了什么?

符号:

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 >
{
}

也许它会起作用。