N4296::14.3/3 [temp.arg]
部分说:
模板参数的名称应在处可访问 使用作为模板参数。 [注:如果名称的话 template-argument可以在用作a时访问 templateargument, 中没有进一步的访问限制 结果实例化其中对应的模板参数 使用名称。 - 后注]
好的,让我们考虑以下示例:
template <class T> class X{
static typename T::S ts;
};
class Y {
private:
class VS{ class S{ }; };
X<VS> x; //1
};
X
实例化中模板//1
的模板参数为class VS
。现在,标准所说的是:
模板参数的名称应在处可访问 它用作模板参数。
class VS
可在//1
点访问,因此需要保留。但是,尽管标准表示没有进一步的访问限制,但代码没有编译。
为什么代码没有编译?根据我提供的部分,我可以说应该编译。
答案 0 :(得分:2)
S是私人的,试试这个:
template <class T> class X{
static typename T::S ts;
};
class Y {
private:
class VS{ public: class S{ }; };
X<VS> x; //1
};