可以"incomplete"类模板的嵌套类
Nested class of class template can be "incomplete"
我不知道如何解释为什么在类模板中创建成员inner
是有效的OuterTempl<T>
而在非模板化类Outer
中创建是非法的。
// Non-template version
struct Outer
{
struct Inner;
Inner inner; // incomplete type (I get this)
};
struct Outer::Inner
{
};
// Template version
template<typename T>
struct OuterTempl
{
struct InnerTempl;
InnerTempl inner; // OK ... Huh!?
};
template<typename T>
struct OuterTempl<T>::InnerTempl
{
};
int main()
{
}
另请参阅IDONE。
是的
- 考虑 [temp.mem.class]/1:
类模板的成员类可以在类外部定义 在其中声明它的模板定义。
[ 注:会员 类必须在首次使用之前定义,这需要 实例化 (14.7.1)。例如template<class T> struct A { class B; }; A<int>::B* b1; // OK: requires A to be defined but not A::B template<class T> class A<T>::B { }; A<int>::B b2; // OK: requires A::B to be defined
— 尾注 ]
同样重要的是要提到,inner
的定义构成了上述注释描述Inner
的使用,只有在需要时才实例化:
除非成员 [...] 已被显式实例化或显式专业化,否则专业化 的成员在专用化 在需要成员定义的上下文中引用;
由于代码中不存在OuterTempl
的实例化,因此永远不会实例化inner
的定义,也永远不需要实例化Inner
。因此,只有在实例化时才需要此类声明的嵌套类类型的完整性。您不会在此处实例化OuterTempl
,但是如果您在定义Inner
之前执行此操作,则代码格式不正确。
那是
template<typename T>
struct OuterTempl
{
struct InnerTempl;
InnerTempl inner;
};
template struct OuterTempl<int>; // Bad - Ill-formed (NDR?)
template<typename T>
struct OuterTempl<T>::InnerTempl {};
template struct OuterTempl<int>; // Fine
演示。
定义类时需要定义成员类型。但是,类模板在实例化之前不会定义。在此之前,任何类型的依赖类型都可以更改。仅当类实例化时,才需要成员的定义。
另一方面,非模板类的定义是一个定义,它需要知道此时其成员的大小。
相关文章:
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 我们可以在main函数中声明嵌套类对象吗
- 是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
- 是否可以在相同的命名空间中,但在不同的嵌套项目中定义具有相同名称的类
- 当使用嵌套类功能时,使用非静态数据成员的使用无效,但是当函数未固定时可以
- 程序员可以用 C++ 编写多少个嵌套结构
- C++ 是否可以使用对变量的引用来简化这种嵌套循环模式?
- C++ 17 可以处理嵌套的可变参数模板吗?
- 是否可以避免在前向声明中使用嵌套命名空间?
- 是否可以使用 SSE 对此嵌套进行矢量化?
- 嵌套类的类内好友是否可以访问外部类成员?
- 阿帕奇箭头可以支持无限级别的嵌套结构吗?
- 我可以在这里摆脱嵌套的循环吗?
- 是否可以使用CUDA并行化此嵌套进行循环
- 我可以嵌套模板吗?
- C++迭代器:抽象类的迭代器可以作为嵌套类实现吗
- 为什么可以获取此枚举成员值,而不必先深入研究嵌套枚举
- 有没有一种方法可以将宏名称作为参数传递给嵌套宏,而在最外层宏展开时不展开它们
- C-do{.}while(0);可以从代码中删除,不包括嵌套的if-else用法
- 可以"incomplete"类模板的嵌套类