【发布时间】:2010-01-05 23:25:12
【问题描述】:
我有一个嵌套在另一个模板中的类模板。部分特化很容易:我只是在其父级中声明另一个 template< … > 块。
但是,我需要另一个偏特化来指定其所有本地模板参数。这使它成为一个明确的专业化。无论出于何种原因,显式特化必须在命名空间范围内。要在其父类之外声明它,必须指定父类,这需要一个非空的模板参数列表。这意味着部分专业化。部分专业化是我正在做的事情,它应该在任意外部范围内工作。但是 GCC 和 Comeau 都无法使用偏特化形式参数识别父提名中的模板参数。
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 > {};
(我把我所有的非工作代码都留在了;适当地注释它以试图理解。)
【问题讨论】:
-
顺便说一下,您可以通过添加一个虚拟参数来解决它,例如
int,它始终是0。这是我第一次玩 C++0x;我正在尝试遍历tuple。我以前做过这种事情,令人讨厌的是 C++0x 的tuple不如 Boost 的强大……遍历模板参数是有用的功能,不应该成为一种仪式。哦,尽管我解决了所有的错误,但 GCC 仍然是 ICE。
标签: c++ templates partial-specialization