Russian Qt Forum

Программирование => С/C++ => Тема начата: StogovOleg от Октябрь 22, 2008, 13:54



Название: Использование дружественных функций в шаблонных классах
Отправлено: 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. Пользуйся тэгом КОД!


Название: Re: Использование дружественных функций в шаблонных классах
Отправлено: Rcus от Октябрь 22, 2008, 14:16
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16


Название: Re: Использование дружественных функций в шаблонных классах
Отправлено: Tonal от Октябрь 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);
}

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