【发布时间】:2013-04-02 17:30:35
【问题描述】:
我的代码具有以下基本结构
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,使用 -std=c++11)和 icpc(13.1)下编译良好,但不是 clang(使用 -std=c++11 -stdlib=libc++),它抱怨使用非公共构造函数(实例化有问题的方法时) )。事实证明,如果朋友声明给出了完整的限定名,clang 很高兴,如
template<typename> friend class my::A;
这是clang的错误吗?我原以为封闭命名空间my 中的任何可见符号都可以在内部命名空间my::details 中使用无需进一步限定。 2011 年标准是怎么说的?
【问题讨论】:
-
甚至认为这个问题有点老了:没有类的前向声明。您要么声明它们,如
template<typename> class A所述,要么提供类定义class Foo {...} -
@SebTu 没有定义的声明(无论什么)通常称为forward declaration。这可以是函数、类或模板。
标签: c++ templates namespaces clang friend