【发布时间】:2010-09-03 12:52:33
【问题描述】:
我根本无法编译它。我可能不可能,但我不知道为什么不应该。
class A {
template <typename T>
class B {
int test() { return 0; }
};
//template <> class B<int>; <-with this, namepace error
B<int> myB_;
};
template <> class A::B<int> {
int test() {
return 1;
}
};
编译器似乎抱怨“必须在使用显式特化“类 A::B”之前声明它。” 如果我尝试在注释行中提供 froward 声明,编译器会抱怨 “必须在包含模板的命名空间中声明显式特化“B”。” 我们在这里使用 2 种不同的编译器。这个错误来自 IBM 在 AIX 上的“xl”编译器,但在我们的 Sun 系统上编译时,我得到了类似的错误,但措辞不同。 这似乎是一个catch-22。
显然,这是一个高度做作、简单化的示例,但它代表了问题所在。 我想在一个类中定义一个模板类,因为模板类只与包含类有关。不应从类外部访问模板。
我错过了什么吗?
【问题讨论】:
-
使用四个空格缩进代码(或选择代码并按Ctrl+K)。
-
这不应该像我们看到的那样编译,即使没有专门化。但那是因为
已被站点删除,将它们与 HTML 标记混淆。请选择代码部分并在发布时使用“101010”工具栏按钮将它们标记为 - 这将完全保留代码。否则,根据标准,在包含类之外进行专业化是可以的。但请恢复缺失的代码部分,以使讨论生效。 -
在您使用 myB_ 的情况下,您可能会考虑使用 PIMPL 习惯用法,此时不需要 B
。
标签: c++ templates nested specialization explicit