Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 02.03.2010, 01:04   #1
__Demon__
Пользователь
 
Аватар для __Demon__
 
Регистрация: 13.08.2009
Сообщений: 37
По умолчанию Шаблоны классов

Не могу понять: Почему компилятор матерится на следующее:

Код:
template<class T>
class MyClass {
public:
        MyClass();
        ~MyClass();
private:
        T parametr;
};
На это объявление выдаёт 51 ошибку, причём все ошибки в iosfwd.h. Среда: C++ Builder 2010.
__Demon__ вне форума Ответить с цитированием
Старый 02.03.2010, 02:15   #2
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

С объявлением порядок.
Выкладывайте определение методов, контекст, в котором используется этот шаблонный класс (полный контекст, со всеми инклудниками) и все ошибки компиляции.
_Ч_ вне форума Ответить с цитированием
Старый 02.03.2010, 17:26   #3
__Demon__
Пользователь
 
Аватар для __Demon__
 
Регистрация: 13.08.2009
Сообщений: 37
По умолчанию

Ну... например так:
Код:
#ifndef UNIT1_H
#define UNIT1_H

template<class T>
class MyClass {
public:
        MyClass();
        ~MyClass();
        void Print();
private:
        T param1;
};
#endif
Код:
// Unit1.cpp
#include <iostream>
using namespace std;

template<class T>
MyClass<T>::MyClass()
{
        param1 = 0;
}

template<class T>
MyClass<T>::~MyClass()
{
}

template<class T>
void MyClass<T>::Print()
{
       cout << param1 << endl;
}
Код:
// main.cpp
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
        MyClass<int> temp;
        temp.Print();
        system("pause");
        return 0;
}
Ошибки( Все не влезли ):

[BCC32 Error] iosfwd(129): E2102 Cannot use template 'streampos' without specifying specialization parameters
Full parser context
Unit1.cpp(8): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost \tr1\tr1\iostream
iostream(16): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost/tr1/detail/config_all.hpp
config_all.hpp(151): #include c:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/utility
utility(5): #include c:\program files\embarcadero\rad studio\7.0\include\dinkumware\iosfw d
iosfwd(9): namespace std
[BCC32 Error] iosfwd(129): E2040 Declaration terminated incorrectly
Full parser context
Unit1.cpp(8): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost \tr1\tr1\iostream
iostream(16): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost/tr1/detail/config_all.hpp
config_all.hpp(151): #include c:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/utility
utility(5): #include c:\program files\embarcadero\rad studio\7.0\include\dinkumware\iosfw d
iosfwd(9): namespace std
[BCC32 Error] iosfwd(251): E2238 Multiple declaration for 'char_traits<>'
Full parser context
Unit1.cpp(8): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost \tr1\tr1\iostream
iostream(16): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost/tr1/detail/config_all.hpp
config_all.hpp(151): #include c:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/utility
utility(5): #include c:\program files\embarcadero\rad studio\7.0\include\dinkumware\iosfw d
iosfwd(9): namespace std
[BCC32 Error] iosfwd(133): E2344 Earlier declaration of 'char_traits<>'
Full parser context
Unit1.cpp(8): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost \tr1\tr1\iostream
iostream(16): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost/tr1/detail/config_all.hpp
config_all.hpp(151): #include c:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/utility
utility(5): #include c:\program files\embarcadero\rad studio\7.0\include\dinkumware\iosfw d
iosfwd(9): namespace std
[BCC32 Error] iosfwd(346): E2238 Multiple declaration for 'char_traits<>'
Full parser context
Unit1.cpp(8): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost \tr1\tr1\iostream
iostream(16): #include C:\Program Files\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost/tr1/detail/config_all.hpp
config_all.hpp(151): #include c:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/utility
utility(5): #include c:\program files\embarcadero\rad studio\7.0\include\dinkumware\iosfw d
iosfwd(9): namespace std
[BCC32 Error] iosfwd(133): E2344 Earlier declaration of 'char_traits<>'
__Demon__ вне форума Ответить с цитированием
Старый 02.03.2010, 17:29   #4
pproger
C++ hater
СуперМодератор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2__Demon__
шаблонные классы не разделяются на h/cpp, все в h.
дальше не смотрел
pproger вне форума Ответить с цитированием
Старый 02.03.2010, 17:42   #5
__Demon__
Пользователь
 
Аватар для __Demon__
 
Регистрация: 13.08.2009
Сообщений: 37
По умолчанию

Учту. Но всеравно даже если перенести всё в .h ошибки не пропадают.
__Demon__ вне форума Ответить с цитированием
Старый 02.03.2010, 17:43   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

может я и ошибаюсь, но если в качестве параметра теплейта будут использоваться integral types, то может разумнее обьявить template <typename T> ..., плюс сильно сомневаюсь что билдер сможет вкурить, что за copy-constructor нужен для param1

Цитата:
MyClass<T>::MyClass()
{
param1 = 0;
}
f.hump вне форума Ответить с цитированием
Старый 02.03.2010, 17:48   #7
pproger
C++ hater
СуперМодератор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2__Demon__

header.h
Код:
#ifndef HEADER_H
#define HEADER_H 

#include <iostream>

using namespace std;

template<typename T> class MyClass {
public:
	MyClass();
	~MyClass();
	void Print();

private:
	T param1;
};


template<typename T> MyClass<T>::MyClass()
{
	param1 = 0;
}

template<typename T> MyClass<T>::~MyClass()
{

}

template<typename T> void MyClass<T>::Print()
{
   cout << param1 << endl;
}


#endif /* HEADER_H */
main.cpp
Код:
#include <iostream>
#include "header.h"

using namespace std;

int main()
{
	MyClass<int> temp;
	temp.Print();
	return 0;
}
единственное, я поменял ключевое слово class в объявлении шаблона на typename, но это не суть
pproger вне форума Ответить с цитированием
Старый 02.03.2010, 17:49   #8
__Demon__
Пользователь
 
Аватар для __Demon__
 
Регистрация: 13.08.2009
Сообщений: 37
По умолчанию

Такое чувство что компилятор плевать хотел на template<class T> или template<typename T>. Он выдаёт одни и теже ошибки.
__Demon__ вне форума Ответить с цитированием
Старый 02.03.2010, 19:48   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,623
По умолчанию

А какой проект вы создаете?
MaTBeu вне форума Ответить с цитированием
Старый 02.03.2010, 21:41   #10
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Студия такой код компилит. Но у меня родная стл, нет буста. Какие настройки в вашей среде - вам виднее.
Единственное, что приходит в голову - вы заюзали using namespace std; в h-файле. Далее, в зависимости от порядка включения всяких инклюдников эта директива может поаффектить на вашу стл или буст, поэтому компилятор сходит с ума. Общее правило - не использовать using директив в h файлах.
И еще раз запостите все файлики вашего проекта со всеми переделками, которые вы сделали. + еще попробуйте сделать ф-ию Print пустой и скомпилить. какие будут ошибки?
_Ч_ вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблоны С++ Secc Помощь студентам 4 27.12.2009 17:35
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 22:18
Шаблоны bondik Общие вопросы C/C++ 10 04.05.2008 08:50
Шаблоны пользовательских классов MaTBeu Общие вопросы C/C++ 2 23.03.2008 19:02


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840