模板参数的访问限制

时间:2015-07-18 05:10:58

标签: c++ templates

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
};

DEMO

X实例化中模板//1的模板参数为class VS。现在,标准所说的是:

  

模板参数的名称应在处可访问   它用作模板参数

class VS可在//1点访问,因此需要保留。但是,尽管标准表示没有进一步的访问限制,但代码没有编译。

为什么代码没有编译?根据我提供的部分,我可以说应该编译。

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
 };