A nested class of a class template may be "incomplete",

I don’t understand how to explain why this is really so, to create a member innerin a class template OuterTempl<T>, whereas it is illegal in an unoccupied class 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()
{
}

See also ideone .

+4
source share
2 answers

Yes - consider [temp.mem.class] / 1:

A member class of a class template can be defined outside the class definition of the template in which it is declared.
[Note: Member class must be determined before its first use, which requires (14.7.1). For instance,

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

- end note]

, 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

.

+4

. , , . . .

, - , .

+4

Source: https://habr.com/ru/post/1569846/


All Articles