Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не линкуется проект с шаблонами, Не линкуется проект с шаблонами на gcc.  
:(
    Опции темы
chdm
Дата 14.10.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Здравствуйте! Сделал вот небольшой тест с шаблонами и не пойму почему не линкуется(((:

(Компилятор gcc 4.3.3)

second.o: In function `main':
second.cpp:(.text+0x151): undefined reference to `vectorHelper<double>::randVector(std::vector<double, std::allocator<double> >, int, double, double)'
second.cpp:(.text+0x1cd): undefined reference to `vectorHelper<double>::printVector(std::basic_ostream<char, std::char_traits<char> >&, std::vector<double, std::allocator<double> >)'
collect2: ld returned 1 exit status
make: *** [all] Error 1 

Помогите разобраться что не так! Заранее благодарю!

second.cpp
Код

#include    "parameters.h"
#include    "stlPractice.h"
#include    <iostream>
#include    <vector>

using namespace std;

int main() {
    vector<double>    vect(TEST_VECTOR_SIZE);
    vectorHelper<double> vectHelper;
    vectHelper.testVector();
    vectHelper.randVector( vect, TEST_VECTOR_SIZE, (double)25.0, (double)154.0);
    vectHelper.printVector( cout, vect);
    cout << "End of program...";
    STL_practice    s;
    cout<< endl<<s.vector_with_iterators(10);
    return 0;
} 



stlPractice.cpp
Код

#include <cctype>
#include <stdlib.h>
#include    <iostream>
//#include    <ostream>
#include    <vector>
#include "parameters.h"
#include "stlPractice.h"
using namespace    std;

int        STL_practice :: vector_with_iterators(int vectorSize)
{

    return EXIT_SUCCESS;
}

/*
 *    !!!DEFAULT_TYPE need is define next operators: <<
 */
template <class DEFAULT_TYPE>
int        vectorHelper<DEFAULT_TYPE> :: printVector(ostream &outStream, vector<DEFAULT_TYPE> vect)
{
    if (!outStream)
        return    EXIT_FAILURE;

    outStream <<  PRINT_VECTOR_STRING << endl;
    typename vector<DEFAULT_TYPE>::iterator curIter = vect.begin();
    for( int i=0;
         curIter!= vect.end();
         ++curIter, ++i)
      {
        outStream  << *curIter << " ";
        if (i>=PRINT_VECTOR_WIDE){
            outStream << endl;
            i=0;
        }
      }
    return    EXIT_SUCCESS;
}

/*
 *    !!!DEFAULT_TYPE need is define next operators: >=, -, +
 */
template <class DEFAULT_TYPE>
int        vectorHelper<DEFAULT_TYPE> :: randVector(vector<DEFAULT_TYPE> vect, int size, DEFAULT_TYPE beg, DEFAULT_TYPE end)
{
    if(beg>=end)
        return EXIT_FAILURE;
    for( typename vector<DEFAULT_TYPE>::iterator curIter = vect.begin();
         curIter!= vect.end();
        *curIter= beg + (end-beg) * (static_cast<double>(rand()%100) / 100), curIter++)  {;}
    return EXIT_SUCCESS;
}



stlPractice.h
Код

#ifndef STLPRACTICE_H_
#define STLPRACTICE_H_

//#include <string>
#include    <iostream>
//#include    <ostream>
#include    <vector>
#include    <ostream>

using namespace    std;

class practikum{
 protected:
    char description[80];
    char author[20];
 public:
    practikum() {;}
};

class STL_practice : public practikum{
 public:
    int        vector_with_iterators(int vectorSize);
};


template <class DEFAULT_TYPE> class vectorHelper{
public:
    /*
     *    Print vector
     */
    int        printVector(ostream &outStream, vector<DEFAULT_TYPE> vect);
     /*
     *        Generate vector with random values
     */
    int        randVector(vector<DEFAULT_TYPE> vect, int size, DEFAULT_TYPE beg, DEFAULT_TYPE end);
     
    /*
     *        function for output testmessege
     */    
    int        testVector() { std::cout << "Running vectorHelper::testVector()" <<
                                        std::endl; }

};


#endif    /* STLPRACTICE_H_ */


parameters.h
Код

#ifndef PARAMETERS_H_
#define PARAMETERS_H_

#define        TEST_VECTOR_SIZE        24
#define        PRINT_VECTOR_STRING        "Vector:"
#define        PRINT_VECTOR_WIDE        8

#endif /* PARAMETERS_H_ */



PM MAIL   Вверх
djamshud
Дата 14.10.2010, 16:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



Реализация всех шаблонных функций, методов шаблонных классов и шаблонных методов классов должны быть в .h.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
chdm
Дата 14.10.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Цитата(djamshud @ 14.10.2010,  16:05)
Реализация всех шаблонных функций, методов шаблонных классов и шаблонных методов классов должны быть в .h.

Спасибо! Не знал этого! А это требование стандарта? или требование gcc? Вы не подскажете?
PM MAIL   Вверх
djamshud
Дата 14.10.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.