如何让模板函数成为模板类的朋友

Gra*_*eme 2 c++ templates friend

我有一个带有私有构造函数和析构函数的模板类:

template <typename T>
class Client
{
    private:
        Client(...) {}
        ~Client()   {}

        template <typename U>
        friend class Client<T>& initialize(...);
};


template <typename T>
Client<T> initialize(...) 
{
      Client<T> client = new Client<T>(...);
}
Run Code Online (Sandbox Code Playgroud)

我不确定朋友的正确语法。有人可以帮忙吗?

In *_*ico 5

忽略省略号(我认为这意味着“一堆与问题无关的参数”),这应该有效:

template <typename T>
class Client
{
private:
    Client() {} // Note private constructor
public:
    ~Client() {} // Note public destructor

    // Note friend template function syntax
    template<typename U>
    friend Client<U> initialize();
};


template<typename T>
Client<T> initialize() 
{
      /* ... */
}
Run Code Online (Sandbox Code Playgroud)

请注意,友元声明本质上与函数声明相同,但friend在返回类型之前添加了关键字前缀。

此外,析构函数是公共的,因此 的用户initialize()将能够破坏返回的 实例Client<>。构造函数仍然是私有的,因此只能initialize()创建它的实例。

上面的代码应该允许它工作:

int main()
{
    Client<int> client = initialize<int>();
}
Run Code Online (Sandbox Code Playgroud)