2012-08-03 81 views
0

我有一个辅助类用于向另一个类提供部分专用版本的方法。我有一次模板,两个专业:C++编译器忽略具有模板化类型的类专业化

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; 

那么结果是主模板实例的辅助函数,并helper2,与第三实例化uint32_t的专业化。

我需要helper2来使用StrangeAccessMethod>专业化。

我在做什么错?

+0

我不明白为什么helper1和helper3应该选择不同的规格。你确定?什么是'AccessMethod'? – 2012-08-03 21:29:10

+0

最后一个应该是:FpgaBaseHelper helper3; – 2012-08-03 21:32:08

+0

您不应将全部大写作为模板参数。它们是为宏而保留的。 – Puppy 2012-08-03 21:34:59

回答

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

也许它会工作。

+0

我认为参数化模板是合法的。 StrangeAccessMethod <>是我需要的专业化。如果用uint32_t替换StrangeAccessMethod <>,它可以工作吗?可能不明白你的意思。 – 2012-08-03 21:34:25

+0

我在StackOverFlow上找到了一个与我想要做的类似的示例: – 2012-08-03 21:40:04

+0

美丽......很好地向您展示我对这种工作原理有一个基本的误解。谢谢! – 2012-08-03 22:01:08