我的代码具有以下基本结构
namespace my {
template<typename> class A; // forward declaration
namespace details {
template<typename T> class B
{
const T*const t;
B(const T*x) : t(x) {} // non-public constructor
template<typename> friend class A; // friend declaration
};
}
template<typename T> class A
{
T*const t;
public:
A(T*x) : t(x) {}
details::B<T> makeb() const // offending method:
{ return details::B<T>(t); } // calls non-public constructor
};
}
它在 gcc(4.7 和 4.8,using -std=c++11
)和 icpc(13.1)下编译得很好,但不是 clang(using -std=c++11 -stdlib=libc++
),它抱怨使用了非公共构造函数(在实例化有问题的方法时)。事实证明,如果朋友声明给出了完整的限定名,clang 很高兴,如
template<typename> friend class my::A;
这是clang的错误吗?我原以为封闭命名空间中的任何可见符号都可以在内部命名空间my
中使用,而无需进一步限定my::details
。2011 年标准怎么说?