powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объявление инстанцированного класса
5 сообщений из 5, страница 1 из 1
Объявление инстанцированного класса
    #34679892
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть код в котором сначала объявляем класс, потом мы его определяем, как инстанцированный шаблон:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class X;

class B {
    public:
        B(X &) {};
};

template<class T>
class A {
        T t;
};

typedef A<int> X;

Компилятор орет:
автор
c.cpp:47: error: conflicting types for `typedef class A<int> X'
c.cpp:35: error: previous declaration as `struct X'


Как объявить класс?
...
Рейтинг: 0 / 0
Объявление инстанцированного класса
    #34679936
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть идея заменить объявление typedef на определение class с отрытым наследованием. Но в этом услучае прийдется повторять все конструкторы не по умолчанию и, возможно, туеву кучу операторов. А это не очень хорошо.
...
Рейтинг: 0 / 0
Объявление инстанцированного класса
    #34680439
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
template<class T>
class A;

typedef A<int> X;

class B {
    public:
        B(X &) {};
};

template<class T>
class A {
        T t;
};
?

--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Объявление инстанцированного класса
    #34680482
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёша если так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
template<class T>
class A;

typedef A<int> X;

class B {
    public:
        B(X &) {};
};

template<class T>
class A {
        T t;
};
?

--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери


Да, так компилит. Но это очень не удобно, если еще допустить классы лежат в разных пространствах имен и т.д.

Вообщем вывод один - все дефениции прийдется повторять, пока результат не будет составлен из деклораций.

Спасибо.
...
Рейтинг: 0 / 0
Объявление инстанцированного класса
    #34680778
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:
> Автор: "Akh"
> Есть код в котором сначала объявляем класс, потом мы его определяем, как
> инстанцированный шаблон:
>
> class X;
>
> class B {
> public:
> B(X &) {};
> };
>
> template<class T>
> class A {
> T t;
> };
>
> typedef A<int> X;
>
>
> Компилятор орет:

Правильно делает. Так нельзя делать, forward declaration класса X
определяет новый тип данных X. А typedef НЕ определяет новый тип данных.
Он только вводит синоним для существующего типа данных с новым именем.

В итоге что получается. Ты говоришь фактически \'у меня есть класс
X, который я опреледю позже. Но это будет класс\'. А потом
говоришь - \'у меня есть тип A<int>, и я его буду называть отныне
еще и как X\'. Но ты уже обещал, что X будет классом, а не синонимом
для X.

А то, что ты хочешь сделать, достигается с помощью forward declaration
шаблона. А там , где тебе уже нужен X, пишешь
typedef A<int> X;

Т.е.

template<typename T> class A;
typedef A<int> X;

.....

а потом где-то уже определяешь A полностью.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объявление инстанцированного класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]