В C++ 11 они позволили дружить с параметром шаблона просто с friend T
Вы также можете использовать методы friend в этом параметре с помощью 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;
}
Я могу дружить с параметром параметра template operator=
просто отлично, но я не могу друг T::T(const T&)
.
Как я могу сделать friend T::T(const T&);
Работа?
edit: Это, по-видимому, другая проблема, чем то, что решается в Make Friend конструктором класса шаблона. Проблема в работе с параметрами круглого шаблона в декларации. Он не имеет отношения к конструктору фактического параметра шаблона.
Тип Foo
- это нормальный шаблонный класс, а не шаблонный параметр, такой как T
в моем примере. Что-то вроде friend Foo<B>::Foo<B>()
из этого представления должно компилироваться просто отлично, в отличие от вопроса, который у меня есть с friend T::T(const T&)
.
edit: В случае, если это в конечном итоге имеет значение, я компилирую с gcc 7.2.
edit: Я также хочу пояснить, что C++ поддерживает создание друзей-конструкторов. Например, friend X::X(char), X::~X();
в первом примере на http://en.cppreference.com/w/cpp/language/friend.
Проблема здесь заключается в том, как создать конструктор параметров шаблона для друга.