crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> проблемка с шаблонными функциями
voipp
  опции профиля:
сообщение 20.12.2009, 17:02
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

Спасибо сказали: 0 раз(а)




Репутация:   0  


шаблонные функции :
template <typename x> void Main_matrix_class::Move(const CVector &direct, x &matrix,bool straight){
    initMtransfer(direct);
    if(straight){
    matrix*=mMove;
    if(!this->dontmovemReformation)this->mReformation*=mMove;//esli dontmovemReformation=true togda mReformation dvigatbsia ne budet
                                                              //v protivnom sluchae mReformation budet izmeniatbcia
}
    else{
        matrix*=(!mMove);
        if(!this->dontmovemReformation)this->mReformation*=(!mMove);
    };

};
//-------------------------------------------------------------------------------------------------------------
template <typename x> x Main_matrix_class::prIsometric(const x &matrix){
    x isomatr(matrix);
    if(isomatr.getHeight()){
    for(int i=0;i<matrix.getHeight();i++){
        isomatr[i][0]=matrix[i][0]*(600/(800-matrix[i][2]));
        isomatr[i][1]=matrix[i][1]*(600/(800-matrix[i][2]));
        isomatr[i][3]=1;
    }
}
else{

    isomatr[0]=matrix[0]*(600/(800-matrix[2]));
    isomatr[1]=matrix[1]*(600/(800-matrix[2]));
    isomatr[3]=1;

    }
//-----------------------------------------------------
// X=x*(z0-z1)/(z0-z)
// Y=y*(z0-z1)/(z0-z)
// z0 - koordinata centra proekcii
// z1 - koordinata kartinnoy ploskosti
// x,y,z - koordinatbI tochki
// X,Y - koordinatbI tochki na kartinnoy ploskosti posle deystviya proekcii
//-----------------------------------------------------
    return isomatr;
};

Вот их опредления :
 template <typename x> void Move(const CVector &direct,x &matrix,bool straight);
template <typename x> x prIsometric(const x &matrix);

Вот как они используются в одной программе :
m.Move((-1) * center,m.mObject,1);
m.prIsometric(mIso);

m - экземпляр класса где находятся шаблонные функции
center m.mObject,mIso - CVector и два CMatrix
Вот ошибка компилятора -
make: *** [LAB3] Ошибка 1
Exited with code 2.
Error while building project LAB3
When executing build step 'Make'

Пробовал исправить отладчиком но при отладке точки остановки он не видит(отладчик исправен)0_0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.12.2009, 17:15
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(voipp @ 20.12.2009, 20:02) *
Ошибка 1
как-то не информативно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanner
  опции профиля:
сообщение 20.12.2009, 17:22
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 27.8.2009
Пользователь №: 1025

Спасибо сказали: 1 раз(а)




Репутация:   0  


Что же ты собрался отлаживать, еще ничего не скомпилировалось?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
voipp
  опции профиля:
сообщение 20.12.2009, 20:27
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

Спасибо сказали: 0 раз(а)




Репутация:   0  


Running build steps for project LAB3...
Configuration unchanged, skipping QMake step.
Starting: /usr/bin/make -w
make: Entering directory `/home/voipp/QTPROGRAMMS/LAB2EM'
g++ -Wl,-rpath,/home/voipp/qtsdk-2009.04/qt/lib -o LAB3 widget.o matrix.o mainwindow.o main.o moc_mainwindow.o -L/home/voipp/qtsdk-2009.04/qt/lib -lQtGui -L/home/voipp/qtsdk-2009.04/qt/lib -L/usr/X11R6/lib -pthread -lfreetype -lgobject-2.0 -lSM -lICE -pthread -pthread -lXrender -lfontconfig -lXext -lX11 -lQtCore -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread
make: Leaving directory `/home/voipp/QTPROGRAMMS/LAB2EM'
widget.o: In function `Widget::mouseMoveEvent(QMouseEvent*)':
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:58: undefined reference to `void<---ВОТ ЗДЕСЬ 1 ОШИБКА Main_matrix_class::Move<CMatrix>(CVector const&, CMatrix&, bool)'<--СТРОКА ГДЕ МОЯ ФУНКЦИЯ ВЫЗЫВАЕТСЯ
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:75: undefined reference to `void Main_matrix_class::Move<CMatrix>(CVector const&, CMatrix&, bool)'
widget.o: In function `Widget::paintEvent(QPaintEvent*)':
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:114: undefined reference to `void Main_matrix_class::Move<CMatrix>(CVector const&, CMatrix&, bool)'
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:190: undefined reference to `void Main_matrix_class::Move<CMatrix>(CVector const&, CMatrix&, bool)'
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:202: undefined reference to `void Main_matrix_class::Move<CMatrix>(CVector const&, CMatrix&, bool)'
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:203: undefined reference to `void Main_matrix_class::Move<CVector>(CVector const&, CVector&, bool)'
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:204: undefined reference to `CMatrix Main_matrix_class::prIsometric<CMatrix>(CMatrix const&)'
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:205: undefined reference to `CVector Main_matrix_class::prIsometric<CVector>(CVector const&)'
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:206: undefined reference to `void Main_matrix_class::Move<CVector>(CVector const&, CVector&, bool)'
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:207: undefined reference to `void Main_matrix_class::Move<CMatrix>(CVector const&, CMatrix&, bool)'
/home/voipp/QTPROGRAMMS/LAB2EM/widget.cpp:214: undefined reference to `void Main_matrix_class::Move<CMatrix>(CVector const&, CMatrix&, bool)'
collect2: ld returned 1 exit status
make: *** [LAB3] Ошибка 1
Exited with code 2.
Error while building project LAB3
When executing build step 'Make'
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 21.12.2009, 9:25
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


2 voipp Определение шаблонных функций - это их код - его ты привёл в первом куске кода. Во втором - объявления. :)
Подобная ошибка может появится тогда, когда определение шаблона находится в одном С++ файле а его использование - в другом.

Наиболее просто исправляется помещением определения в заголовок (*.h) :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2009, 10:25
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


ну, если компилер не мелкософтовский - может, поможет помещение определения в заголовок.
у мелкософта надо прямо в сишный(!) файл засовывать тэмплейты. иначе, сцуко, он их выкусит и потом сругнётся, что нету у тебя такой функции. об этом очень мелко написано где-то в MSDN - типа, несоответствия компилера мелкософт стандартам.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 22.12.2009, 11:24
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


2 Iron Bug Дай ссылочку, а? Что-то я такой особенности не помню - не натыкался...
И тот же boost устроен практически одинаково и для VC и для g++.

Другое дело, что в том же багланде я вовсю использовал следующий финт: реализацию шаблонов-членов пихал в исходник а в его конце явно воплощал (инстансировал) шаблоны нужными типами.
После этого шаблоны для этих типов использовались в других исходниках. :)
А вот с g++ такой номер не прошел. :(
Правда это было довольно давно. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2009, 12:19
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


есть там такое. не помню, когда оно там точно проявляется... суть там была вроде бы в экспорте шаблонных функций из библиотек или типа того. я уже не помню, но гемора мне это тогда доставило выше крыши.
это уже вторая бага мелкософтовского компилера, на которую я вот так влоб натыкалась. причём вот с шаблонами они, похоже, и не собираются исправлять её даже.

не, всё-таки паранойя меня замучила и я нашла эту статейку про несоответствия.
думаю, всем программистам под кроссплатформу будет полезно с ней ознакомиться:

Nonstandard Behavior of MSVC

кстати, от студии к студии эта статейка не меняется: по ходу, индусы просто документируют баги :)

Сообщение отредактировал Iron Bug - 22.12.2009, 12:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 22.12.2009, 15:04
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


А, экспорт. Он у многих не поддерживается. :)
Я и не пытался его использовать никогда.
В g++ его тоже ещё недавно не было - сейчас не в курсе.

Одно время вроде пытались его вообще из стандарта выкинуть - уж больно сложно он со стандартным циклом компиляция/линкинг сочитается.
Но потом его в комо удалось реализовать - так что оставили. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 16:51