дружественная функция-шаблон в шаблоне класса
От: Molchalnik  
Дата: 10.07.11 10:26
Оценка:
пытаюсь в проекте объявить дружественную функцию-шаблон в шаблоне класса. Всё время выходит какая-нибудь ерунда. Вот пример:




template<class Tn> class A
{
private:
void someF(){};
};
template<class Tn> class B: private A<Tn>
{
};
template<class Tn> class C: public B<Tn>
{
public:
void Do(C<Tn> &a) {};
friend void F(C<Tn> &a, C<Tn> &b);
void start(void){};
};

template<class Tn> void F(C<int> &a,C<int> &b)
{
a.Do(b);
b.Do(a);
a.someF();
b.someF();
}


//---------------------------------------------------------------------------
void __fastcall TForm2::FormActivate(TObject *Sender)
{
C<int> SOMEclassX,SOMEclassY;
SOMEclassX.start();
F(SOMEclassX,SOMEclassY);
}

в результате получаю сообщение Exception handle variable may not be used here на строке

F(SOMEclassX,SOMEclassY);

Подскажите, что я делаю не так?
Re: дружественная функция-шаблон в шаблоне класса
От: denisko http://sdeniskos.blogspot.com/
Дата: 10.07.11 10:34
Оценка:
Здравствуйте, 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  
Дата: 10.07.11 10:50
Оценка:
D>Зачем вот это?

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>>}

как зачем? определение дружественной функции. вообще, не очень понял, о чём вопрос.
Re[3]: дружественная функция-шаблон в шаблоне класса
От: uzhas Ниоткуда  
Дата: 10.07.11 11:12
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>как зачем? определение дружественной функции. вообще, не очень понял, о чём вопрос.

вы определитесь: у вас друг является простой функцией или шалонной
вот вариант, когда друг является простой функцией:
http://ideone.com/M5XUH
некорректный код закомментирован. как вы видите, с помощью друга нельзя залезть в базу, методы которой скрыты, благодаря слову private
лучше рассмотреть примеры попроще, что-то вы перемудрили
1) http://ideone.com/p8D6X
2) http://ideone.com/vWbe6
Re[4]: дружественная функция-шаблон в шаблоне класса
От: Molchalnik  
Дата: 10.07.11 11:19
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Molchalnik, Вы писали:


M>>как зачем? определение дружественной функции. вообще, не очень понял, о чём вопрос.

U>вы определитесь: у вас друг является простой функцией или шалонной

шаблонной

U>вот вариант, когда друг является простой функцией:

U>http://ideone.com/M5XUH
U>некорректный код закомментирован. как вы видите, с помощью друга нельзя залезть в базу, методы которой скрыты, благодаря слову private

спасибо, но с protected получается тоже самое, без изменений

U>лучше рассмотреть примеры попроще, что-то вы перемудрили

U>1) http://ideone.com/p8D6X
U>2) http://ideone.com/vWbe6

мне нужно отладить уже существующий проект. Это наиболее простое воспроизведение проблемы в упрощённой форме. Только вместо protected случайно private поставил, простите.
Re: дружественная функция-шаблон в шаблоне класса
От: _nn_ www.nemerleweb.com
Дата: 10.07.11 11:29
Оценка: 3 (1) +1
Здравствуйте, Molchalnik, Вы писали:

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.
Она шаблонная как я написал или нет ?

Код собрался на ideone.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: дружественная функция-шаблон в шаблоне класса
От: uzhas Ниоткуда  
Дата: 10.07.11 11:35
Оценка: +1
Здравствуйте, Molchalnik, Вы писали:

M>мне нужно отладить уже существующий проект. Это наиболее простое воспроизведение проблемы в упрощённой форме. Только вместо protected случайно private поставил, простите.

http://ideone.com/NvpkH
только заметьте, что я убрал приватное наследование
Re[2]: дружественная функция-шаблон в шаблоне класса
От: Molchalnik  
Дата: 10.07.11 11:41
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, Molchalnik, Вы писали:


__>
__>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.
__>Она шаблонная как я написал или нет ?

__>Код собрался на ideone.


спасибо, Вы всё правильно написали. и работает. Плюс в карму. Посмотрю ещё, почему эта конструкция у меня не заработала в оригинальном коде.
Re[6]: дружественная функция-шаблон в шаблоне класса
От: Molchalnik  
Дата: 10.07.11 11:45
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Molchalnik, Вы писали:


M>>мне нужно отладить уже существующий проект. Это наиболее простое воспроизведение проблемы в упрощённой форме. Только вместо protected случайно private поставил, простите.

U>http://ideone.com/NvpkH
U>только заметьте, что я убрал приватное наследование

Спасибо за идею!!! Но хочу отметить, что приватное наследование нужно для моего проекта для соблюдения правильной логики программирования и доступа.
Re[2]: дружественная функция-шаблон в шаблоне класса
От: Molchalnik  
Дата: 10.07.11 14:58
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, Molchalnik, Вы писали:


__>
__>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.
__>Она шаблонная как я написал или нет ?

__>Код собрался на ideone.


Извиняюсь. Не выходит Пишет, A<int>::someF is not accessible

а вот если объявление friend добавить в класс-предок, в котором описана данная функция — то всё выходит.

friend не работает к наследникам без особого приглашения, оказывается
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.