如何使模板参数的构造函数成为朋友?

irf*_*fna 15 c++ templates friend

在C++ 11中,他们可以简单地使用模板参数friend T.您还可以使用该参数中的朋友方法friend T::Method().

但是,你如何与模板参数的构造函数相关联?

class BeMyFriend
{
public:
 BeMyFriend& operator=(const BeMyFriend& rhs) = default;
 BeMyFriend(const BeMyFriend& rhs) = default;
};

template<class T>
class Test
{
 friend T& T::operator=(const T&); //Works fine, no error
 friend T::T(const T&); //error: prototype for 'BeMyFriend::BeMyFriend(const BeMyFriend&)' does not match any in class 'BeMyFriend'
};

int main()
{
 Test<BeMyFriend> hmm;

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

我能够将模板参数的朋友operator=很好,但我不能和朋友在一起T::T(const T&).

我怎样才能friend T::T(const T&);上班?


编辑:这似乎与Make Friend在模板类的构造函数中解决的问题不同.那里的问题是在声明中处理循环模板参数.它不处理实际模板参数的构造函数.

它的类型Foo是普通的模板化类,而不是像T我的例子中的模板参数.friend Foo<B>::Foo<B>()从那个提交的东西应该编译得很好,不像我在这里的问题friend T::T(const T&).

编辑:如果这最终成为问题,我正在使用gcc 7.2进行编译.

编辑:我还想澄清一下,C++确实支持让构造函数成为朋友.例如,friend X::X(char), X::~X();http://en.cppreference.com/w/cpp/language/friend的第一个示例中.

这里的问题是如何使模板参数的构造函数成为朋友.

osd*_*ev0 0

我可以通过添加void以下内容来在 GCC 中编译它friend

friend void T::T(const T&);
Run Code Online (Sandbox Code Playgroud)

然后我可以从的构造函数访问 的Test私有成员之一。BeMyFriend但是,请注意,这是特定于编译器的。我在 clang 中尝试过,但没有成功