Здравствуйте, Molchalnik, Вы писали:
M>пытаюсь в проекте объявить дружественную функцию-шаблон в шаблоне класса. Всё время выходит какая-нибудь ерунда. Вот пример:
Зачем вот это?
M>template<class Tn> void F(C<int> &a,C<int> &b) M>{ M>a.Do(b); M>b.Do(a); M>a.someF(); M>b.someF(); M>}
M>Подскажите, что я делаю не так?
<Подпись удалена модератором>
Re[2]: дружественная функция-шаблон в шаблоне класса
Здравствуйте, Molchalnik, Вы писали:
M>как зачем? определение дружественной функции. вообще, не очень понял, о чём вопрос.
вы определитесь: у вас друг является простой функцией или шалонной
вот вариант, когда друг является простой функцией: http://ideone.com/M5XUH
некорректный код закомментирован. как вы видите, с помощью друга нельзя залезть в базу, методы которой скрыты, благодаря слову private
лучше рассмотреть примеры попроще, что-то вы перемудрили
1) http://ideone.com/p8D6X
2) http://ideone.com/vWbe6
Re[4]: дружественная функция-шаблон в шаблоне класса
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Molchalnik, Вы писали:
M>>как зачем? определение дружественной функции. вообще, не очень понял, о чём вопрос. U>вы определитесь: у вас друг является простой функцией или шалонной
шаблонной
U>вот вариант, когда друг является простой функцией: U>http://ideone.com/M5XUH U>некорректный код закомментирован. как вы видите, с помощью друга нельзя залезть в базу, методы которой скрыты, благодаря слову private
мне нужно отладить уже существующий проект. Это наиболее простое воспроизведение проблемы в упрощённой форме. Только вместо protected случайно private поставил, простите.
template<class Tn> class A
{
protected:
void someF(){};
};
template<class Tn> class B: public A<Tn>
{
};
template<class Tn> class C;
template<class Tn> void F(C<Tn> &a,C<Tn> &b);
template<class Tn> class C: public B<Tn>
{
public:
void Do(C<Tn> &a) {};
friend void F<Tn>(C<Tn> &a, C<Tn> &b);
void start(void){};
};
template<class Tn> void F(C<Tn> &a,C<Tn> &b)
{
a.Do(b);
b.Do(a);
a.someF();
b.someF();
}
//---------------------------------------------------------------------------int main()
{
C<int> SOMEclassX,SOMEclassY;
SOMEclassX.start();
F(SOMEclassX,SOMEclassY);
}
Заметки
1. Декларируем C и F до реализация.
2. private в A , там не protected/public ?
3. class B: private A<Tn>
Точно не public/protected.
Иначе из класса С не добраться до этой функции.
4. Вы определитесь как выглядит функция F.
Она шаблонная как я написал или нет ?
Здравствуйте, Molchalnik, Вы писали:
M>мне нужно отладить уже существующий проект. Это наиболее простое воспроизведение проблемы в упрощённой форме. Только вместо protected случайно private поставил, простите. http://ideone.com/NvpkH
только заметьте, что я убрал приватное наследование
Re[2]: дружественная функция-шаблон в шаблоне класса
__>Заметки __>1. Декларируем C и F до реализация. __>2. private в A , там не protected/public ? __>3. class B: private A<Tn> __>Точно не public/protected. __>Иначе из класса С не добраться до этой функции. __>4. Вы определитесь как выглядит функция F. __>Она шаблонная как я написал или нет ?
__>Код собрался на ideone.
спасибо, Вы всё правильно написали. и работает. Плюс в карму. Посмотрю ещё, почему эта конструкция у меня не заработала в оригинальном коде.
Re[6]: дружественная функция-шаблон в шаблоне класса
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Molchalnik, Вы писали:
M>>мне нужно отладить уже существующий проект. Это наиболее простое воспроизведение проблемы в упрощённой форме. Только вместо protected случайно private поставил, простите. U>http://ideone.com/NvpkH U>только заметьте, что я убрал приватное наследование
Спасибо за идею!!! Но хочу отметить, что приватное наследование нужно для моего проекта для соблюдения правильной логики программирования и доступа.
Re[2]: дружественная функция-шаблон в шаблоне класса
__>Заметки __>1. Декларируем C и F до реализация. __>2. private в A , там не protected/public ? __>3. class B: private A<Tn> __>Точно не public/protected. __>Иначе из класса С не добраться до этой функции. __>4. Вы определитесь как выглядит функция F. __>Она шаблонная как я написал или нет ?
__>Код собрался на ideone.
Извиняюсь. Не выходит Пишет, A<int>::someF is not accessible
а вот если объявление friend добавить в класс-предок, в котором описана данная функция — то всё выходит.
friend не работает к наследникам без особого приглашения, оказывается