Russian Qt Forum
Ноябрь 23, 2024, 07:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование дружественных функций в шаблонных классах  (Прочитано 5937 раз)
StogovOleg
Гость
« : Октябрь 22, 2008, 13:54 »

Почему компилируется но не линкуется следующий код:

Код:
template<class type1> class T1
{
   
    friend int f1(T1& val, int val2);
    private:
    type1 a;
};

template<class type1> int f1(T1<type1>& val, int val2)
{
    val.a = val2;
};
// функция использующая шаблонный класс
Код:
void  Form0::init()
{
 T1<int> rrr;
 T1<double> rrr2;
 f1(rrr, 7);
 f1(rrr2, 9);
}


1. Правильно выбираей раздел форума!
2. Пользуйся тэгом КОД!
« Последнее редактирование: Октябрь 22, 2008, 15:33 от pastor » Записан
Rcus
Гость
« Ответ #1 : Октябрь 22, 2008, 14:16 »

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16
Записан
Tonal
Гость
« Ответ #2 : Октябрь 22, 2008, 21:24 »

Вроде компилятор вполне поятно всё объясняет:
Цитировать
sss.cpp:3: warning: friend declaration `int f1(T1<type1>&, int)' declares a non-template function
sss.cpp:3: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
sss.cpp: In function `int f1(T1<type1>&, int)':
sss.cpp:11: warning: no return statement in function returning non-void
C:\Temp/ccQ8RvRo.o:sss.cpp:(.text+0x39): undefined reference to `f1(T1<int>&, int)'
C:\Temp/ccQ8RvRo.o:sss.cpp:(.text+0x4c): undefined reference to `f1(T1<double>&, int)'
collect2: ld returned 1 exit status
компилится и собирается следующий код:
Код:
class T1;

template<class type1>
int f1(T1<type1>& val, int val2);

template<class type1>
class T1 {
    friend int f1<>(T1& val, int val2);
    private:
    type1 a;
};

template<class type1>
int f1(T1<type1>& val, int val2) {
    val.a = val2;
};

int main() {
  T1<int> rrr;
  T1<double> rrr2;
  f1(rrr, 7);
  f1(rrr2, 9);
}

П.С. Если хочится плотно развликаться с шаблонами - выбрось дебилдер.
Там багов немерянно именно в обработке шаблонных конструкций.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.