首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有专门化父模板的情况下专门化成员模板

在没有专门化父模板的情况下专门化成员模板
EN

Stack Overflow用户
提问于 2010-01-05 23:25:12
回答 4查看 1.2K关注 0票数 10

我在另一个模板中嵌套了一个类模板。部分地专门化它很容易:我只是在它的父块中声明另一个template< … >块。

但是,我需要另一个部分专门化,它恰好指定了所有本地模板参数。这使得它成为一个显式的专门化。无论出于什么原因,显式的专门化必须在命名空间范围内。若要在父类之外声明它,必须指定父类,这需要一个非空模板参数列表。这意味着部分专业化。部分专业化是我要做的,它应该在任意的外部范围内工作。但是GCC和Comeau都没有用部分专业化的形式参数来识别父母提名中的模板参数。

代码语言:javascript
复制
template< class X > struct A {
    template< class Y > struct B; // initial declaration OK

    template< class Z >
    struct B< A< Z > > {}; // partial OK as long as there's a local arg

    template<> // ERROR: this syntax triggers explicit specialization
    struct B< int > {};
};

template<> // ERROR: can't nest template<>s here (why?)
template< class X > // ERROR: can't deduce X from type of A<X>::B<int> (why?)
struct A< X >::B< int > {};

(我把所有不工作的代码都留在了里面;对它进行适当的注释,以使其有意义。)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-06 12:41:47

根据C++标准14.7.3/18,这是非法的:

……如果类成员模板的封闭类模板也不是显式专门化的,则声明不应显式地专门化类成员模板。

票数 9
EN

Stack Overflow用户

发布于 2010-01-06 18:11:17

我倾向于不过多地使用嵌套类。我的主要抱怨是,他们有一种倾向于膨胀他们嵌套的类的代码。

因此,我建议另一个解决办法:

代码语言:javascript
复制
namespace detail
{
  template <class X, class Z> class BImpl;
  template <class X, class Z> class BImpl<X, A<Z> > {};
  template <class X> class BImpl<X,int> {};
}

template <class X>
class A
{
  template <class Z> struct B: BImpl<X,Z> {};
};

请注意,它需要将X作为参数传递给BImpl,如果您希望也专门化A的话。有趣的是,在这种情况下,我只得到了部分专业化!

票数 4
EN

Stack Overflow用户

发布于 2010-01-06 00:29:31

复杂的东西。你的初始代码是VC10 Beta2,很好。

首先,我觉得你倒过来了:

代码语言:javascript
复制
template<> 
template< class X > 
struct A< X >::B< int > {};

X是结构A的模板参数,而B是完全专门化的,所以我认为应该是这样的:

代码语言:javascript
复制
template< class X > 
template<> 
struct A< X >::B< int > {};

但即使这样也无法编译。但是,错误文本实际上是有用的:

a.cpp a.cpp(11):C3212:'A::B‘:模板成员的显式专门化必须是显式专门化a.cpp(8)的成员:参见'A::B’的声明

如果你也完全专攻A,那么完全专门化B似乎是合法的。

编辑:好的,我收到了一些能权威地谈论这个问题的人的回复--套用一下,这是标准中一个非常模糊的领域,而清理它是C++委员会的一个悬而未决的问题(" it“是类模板成员的明确的专门化)。在短期内,建议是“不要那样做”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2009924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档