繁体   English   中英

C ++编译器忽略模板化类型的专业化

[英]C++ Compiler ignoring class specialization with templatized type

我有一个帮助程序类,用于为另一类提供部分专门的方法版本。 我有主要模板和两个专长:

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

也许会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM