4

考虑这个示例代码:

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是 的别名pt_type<V<int>>。然而,它被定义的事实取决于它被引用的上下文。

C++ 标准在哪里解释了模板参数对模板参数的替换是在引用别名特化的上下文中执行的?

4

3 回答 3

9

无处。这是核心问题 1554

从 14.5.7 [temp.alias] 的当前措辞来看,别名模板和访问控制的交互并不清楚。例如:

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

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

struct C {
  foo<B> f;    // Well-formed?
};
于 2018-01-25T23:23:57.970 回答
-1

在 V::pt 中,您正在访问您的“自己的”类型并且您可以这样做,但在第二种情况下,私有使得它不可能。所以 V::pt 创建了一个 pt_type 的实例,传递你的私有类型 int。但是在第二种情况下,您直接尝试并不起作用,

于 2018-01-25T23:11:51.873 回答
-1

using pt_type = typename T::type;无法访问 V::type 因为类型是私有的。

以下作品:

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
}
于 2018-01-25T23:09:50.693 回答