Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
06.07.2011, 18:16     Конструктор шаблона класса #1
Добрый день. Столкнулся с проблемой:
имеется код

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'ом, имея шаблонный класс?

Заранее спасибо за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2011, 18:16     Конструктор шаблона класса
Посмотрите здесь:

В конструктор класса передать объект этого класса C++
C++ Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка
C++ Конструктор производного класса требует конструктор предка
Конструктор класса не видит конструктор по умолчанию другого класса C++
C++ Определение метода-шаблона за пределами шаблона класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.07.2011, 18:22     Конструктор шаблона класса #2
Paporotnik, Шаблонные typedef-ы насколько я помню нереальны. Можно typedef только для инстанцированного.
До С++0x по крайней мере. Но могу и ошибаться.
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
06.07.2011, 18:52     Конструктор шаблона класса #3
Можно внутри структуры этот typedef определить:
C++
1
2
3
4
 template <class link_element> struct link_record
 {
   typedef link_record<link_element>* PLinkRec;
 };
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
06.07.2011, 20:58  [ТС]     Конструктор шаблона класса #4
ForEveR, спасибо, похоже не правду. придется прописывать все целиком.

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

Проблема с конструктором пропала, как только воспользовался NetBeans'ом вместо Rad Studio.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
06.07.2011, 21:16     Конструктор шаблона класса #5
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;
}
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
06.07.2011, 21:39     Конструктор шаблона класса #6
Цитата Сообщение от 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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2011, 09:14     Конструктор шаблона класса
Еще ссылки по теме:

Конструктор класса C++
Явное создание экземпляра класса и явная специализация шаблона класса C++
C++ Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.07.2011, 09:14     Конструктор шаблона класса #7
Цитата Сообщение от Paporotnik Посмотреть сообщение
"не удается разрешить идентификатор"
Используй typename
C++
1
typename link_record::PLinkRec ptr = 0;
Yandex
Объявления
07.07.2011, 09:14     Конструктор шаблона класса
Ответ Создать тему
Опции темы

Текущее время: 10:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru