шаблонvoid h (T const (&) [N]);как функция друга - PullRequest
2 голосов
/ 29 октября 2019

Существует отдельная функция (не принадлежащая члену), определенная как:

template<class T, std::size_t N> 
auto foo(T const(&init)[N]) { /* ... */ }

foo () предназначена для вывода N (размера массива)

Кроме того, в пределах того же самогоВ пространстве имен существует класс, определяемый как:

class Bar {

friend auto foo( Bar const(&)[/* ??? */] ); /* <-------- The goal to make it right */

private:
    Bar( void ) { /* ... */ }
};

Моя проблема в том, что мне пока не удалось объявить foo() в качестве друга для класса Bar, чтобы он мог обращаться к закрытым членам.

В объявлении foo() есть параметр шаблона std::size_t N. Но как сделать дружбу всех N значений?

Большое спасибо заранее всем, кто готов помочь.

Мартин

1 Ответ

2 голосов
/ 29 октября 2019

Ваша первая декларация объявляет, что foo - это имя шаблона. функция с именем foo отсутствует. Функции, сгенерированные из шаблона с именем foo, будут иметь имена наподобие foo<T, N>, где T - это имя типа, а N - целое число.

Ваша декларация друга объявляет, что должен быть foo который является именем функции. Это не совпадает с foo, который является именем шаблона.

Если вы хотите объявить, что Bar разрешит любое создание шаблона foo формы foo<Bar, *>чтобы получить доступ к его частным лицам ... ну, вы не можете. Вы можете объявить друга всем, что генерирует шаблон:

template<typename T, std::size_t N>
friend auto foo( T const(&)[N] );

Вы можете объявить дружбу с конкретным экземпляром шаблона:

friend auto foo<Bar, 20>( Bar const(&)[20] );

Но вы не можете объявить его другомтолько некоторые шаблонных функций. Если вы попробуете что-то вроде этого:

template<std::size_t N>
friend auto foo(Bar const(&init)[N]);

Вы обнаружите, что ваш оригинальный foo не сможет получить к нему доступ. Это относится к другому шаблону из шаблона foo, так как он принимает другие параметры.

...