在Linux上使用GCC 4.8.2,我想授予工厂方法Create()访问类C的私有构造函数,但是我在尝试声明时得到“错误:'在此范围内未声明'创建'”一个专业的朋友。如何在不向B :: Create()的所有类型打开声明的情况下使其工作?
template <typename T> class A {
public:
class B;
template <typename U> class C;
};
template <typename T>
class A<T>::B {
public:
template <typename U> static void Create();
};
template <typename T> template <typename U>
class A<T>::C {
C() = default;
friend void B::Create<U>();
};
template <typename T> template <typename U>
void A<T>::B::Create() {
C<U>{};
}
int main() {
A<int>::B::Create<char>();
}
答案 0 :(得分:1)
我认为您遇到了编译器缺陷。以下代码仅使用一层模板,在g ++ 4.8.2中运行良好。
class Foo
{
public:
template <typename U> static Foo* Create();
};
template <typename U> class Bar : public Foo
{
private:
Bar() = default;
friend Foo* Foo::Create<U>();
};
template <typename U>
Foo* Foo::Create() {
return new Bar<U>();
}
但是,相同的编译器无法编译您的代码。我认为你已经尝试过的一种解决方法是替换
friend B* B::Create<U>();
与
template <typename V>
friend B* B::Create<V>();
答案 1 :(得分:1)
我刚刚在MSVC ++中测试了你的代码,它也失败了。我能够通过给朋友声明一个更明确的名字来修复它。请记住,您可以在任何地方提供完全合格的名称!
我刚刚更换了
friend B* B::Create<U>();
带
friend B* A<T>::B::Create<U>();
我会启动MinGW并查看它是否真的符合您的预期。