Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/79: Рейтинг темы: голосов - 79, средняя оценка - 4.51
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512

Конструктор шаблона класса

06.07.2011, 18:16. Показов 16224. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Столкнулся с проблемой:
имеется код

C++
1
2
3
4
5
6
7
template <class L> class smthing {
    private:  
        ..... 
    public:
        smthing();
        .....
};
на попытку расписать конструктор вне определения класса:

C++
1
2
3
template <class L> smthing<L> :: smthing() {
    ......
}
компилятор выдает ошибку:

[BCC32 Error] smthing.h(24): E2316 'smthing<l>::smthing()' is not a member of 'smthing<l>'

Весь код в одном h-файле. Среда Embarcadero Rad Studio XE.

и вдогонку второй вопрос.
в Embarcadero Rad Studio XE строки типа:
C++
1
2
template <class link_element> struct link_record;
typedef link_record<link_element>* PLinkRec;
воспринимаются нормально, в то время как в Codegear C++ Builder выдает ошибку:
[BCC32 Error] file2.h(2): E2451 Undefined symbol 'link_element'

Так как же правильно пользоваться typedef'ом, имея шаблонный класс?

Заранее спасибо за ответы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.07.2011, 18:16
Ответы с готовыми решениями:

Конструктор-копирование шаблона класса
Объясните пожалуйста, что я делаю не так.

Конструктор класса не видит конструктор по умолчанию другого класса
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Определение метода-шаблона за пределами шаблона класса
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { ...

6
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
06.07.2011, 18:22
Paporotnik, Шаблонные typedef-ы насколько я помню нереальны. Можно typedef только для инстанцированного.
До С++0x по крайней мере. Но могу и ошибаться.
1
71 / 76 / 9
Регистрация: 30.06.2011
Сообщений: 176
06.07.2011, 18:52
Можно внутри структуры этот typedef определить:
C++
1
2
3
4
 template <class link_element> struct link_record
 {
   typedef link_record<link_element>* PLinkRec;
 };
0
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
06.07.2011, 20:58  [ТС]
ForEveR, спасибо, похоже не правду. придется прописывать все целиком.

An1ka, предложенный вами вариант делает новый идентификатор доступным только внутри определения структуры. по крайней мере все объявления с ним вне её выдают ошибку "не удается разрешить идентификатор".

Проблема с конструктором пропала, как только воспользовался NetBeans'ом вместо Rad Studio.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
06.07.2011, 21:16
Paporotnik, странно... У меня, например, такой код нормально отрабатывает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
template< typename T >
class Foo
{
public:
    Foo();
};
 
template< typename T >
Foo< T >::Foo()
{
    std::cout << "Foo< "<< typeid(T).name() << " >::Foo()" << std::endl;
}
 
int main()
{
    Foo< int > bar;
 
    return 0;
}
0
71 / 76 / 9
Регистрация: 30.06.2011
Сообщений: 176
06.07.2011, 21:39
Цитата Сообщение от Paporotnik Посмотреть сообщение
An1ka, предложенный вами вариант делает новый идентификатор доступным только внутри определения структуры. по крайней мере все объявления с ним вне её выдают ошибку "не удается разрешить идентификатор".
Ну правильно. Мы ведь не можем создать идентификатор неопределенного типа. Шаблон - это только заготовка. Для создания реальных объектов и использования вне шаблонной структуры нужно указывать тип:
C++
1
2
3
4
5
6
 template <class link_element> struct link_record
 {
   typedef link_record<link_element>* PLinkRec;
 };
...
link_record<int>::PLinkRec p;
Или :
C++
1
2
 template <class link_element> struct link_record;
typedef link_record< int>* PLinkRecInt;
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.07.2011, 09:14
Цитата Сообщение от Paporotnik Посмотреть сообщение
"не удается разрешить идентификатор"
Используй typename
C++
1
typename link_record::PLinkRec ptr = 0;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2011, 09:14
Помогаю со студенческими работами здесь

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) { this-&gt;iType_act = iType_activation_funk; switch...

Конструктор производного класса требует конструктор предка
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...

Явное создание экземпляра класса и явная специализация шаблона класса
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Конструктор внутри класса, поля которого являются членами другого класса
Вот фрагмент кода. class Class_Figure { Class_Triangle tr1; Class_Circle cr1; public: Class_Figure() { } void...

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний треугольник.В конструкторе треугольника вводятся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru