Why a template alias specialization depends on the context in which it is referred?

136 Views Asked by At

Consider this example code:

template <class T>
using pt_type = typename T::type;

template <class T>
class V {
  using type = int;
  public:
  using pt = pt_type<V>;
};

void g() {
  V<int>::pt a; // Does compile
  pt_type<V<int>> b; // Does not compile
}

V<int>::pt is an alias for pt_type<V<int>>. Nevertheless the fact it is defined depends on the context where it is referred.

Where is it explained in the C++ standard that the substitution of the template parameter by the template argument is performed in the context where is refered the alias specialization?

3

There are 3 best solutions below

0
T.C. On BEST ANSWER

Nowhere. This is core issue 1554.

The interaction of alias templates and access control is not clear from the current wording of 14.5.7 [temp.alias]. For example:

template <class T> using foo = typename T::foo;

class B {
  typedef int foo;
  friend struct C;
};

struct C {
  foo<B> f;    // Well-formed?
};
1
Caleb On

using pt_type = typename T::type; can't access V::type becasue type is private.

The following works:

template <class T>
using pt_type = typename T::type;

template<class T>
class V
{
  public:
    using type = int;
    using pt = pt_type<V>;
};

void g()
{
    V<int>::pt a; //Do compile
    pt_type<V<int>> b; //Do not compile
}
3
LeDYoM On

In V::pt you are accessing to your "own" type and you can do it, but the private makes it impossible in the second case. So V::pt crates an instanciation of pt_type passing your private type int. But in the second case you try directly and it does not work,