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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> typedef для внутреннего шаблонного класса 
:(
    Опции темы
Orlan
  Дата 18.1.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

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



Есть код:
Код

template <class T>
class A 
{
    typedef typename T::inner_class inner_class_;
};

class B : public A<B>
{
public:
    class inner_class 
    {
    };
};
//typedef B::inner_class inner_class;

Если закомментировать четвертую строку и добавить в конец
Код

typedef B::inner_class inner_class;

то все компилируется нормально

Компилятор Visual C++ 7.1 (2003) выдает ошибку:

line 4: error C2039: 'inner_class' : is not a member of 'B'
line 4: error C2146: syntax error : missing ';' before identifier 'inner_class'
line 4: error C2501: 'A<T>::inner_class_' : missing storage-class or type specifiers

Чего это он не хочет внутри класса делать дефайн?
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Mayk
Дата 18.1.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Еще бы. Вы берёте тип из класса (B), которого еще не существует.
Для того чтобы класс B стал существовать в бренном мире (=> существовал B::inner_class) необходимо, чтобы существовал A<B>.
До тех пор пока A<B> не существует, не существует и класса B.
Класс A<B> требует существования класса B. Который не существует.

Это сообщение отредактировал(а) Mayk - 18.1.2006, 18:01


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Orlan
Дата 18.1.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

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



Странно, а так копилится:
Код

template <class T>
class A 
{
    //typedef typename T::inner_class inner_class_;
    void some_method1()
    {
        typedef typename T::inner_class inner_class_;
    }
    void some_method2()
    {
        T * pT = static_cast<T*>(*this);
    }
};
class B : public A<B>
{
public:
    class inner_class 
    {
    };
};


Чего же после переноса проблемной строки в тело метода уже не "требуется существование класса В" или методы не "создаются" вместе с классом? smile
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
Mayk
Дата 18.1.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Цитата(Orlan @ 18.1.2006, 22:22 Найти цитируемый пост)

Чего же после переноса проблемной строки в тело метода уже не "требуется существование класса В" или методы не "создаются" вместе с классом?

Сравните:

Код

class Foo;
class Bar{
    typedef class Foo::inner_class inner_class_; //CT-Error
};

и
Код

class Foo;
class Bar{
   void some_method1();
};
/*#include "foo.h"*/
struct Foo{
  class inner_class{};
};
/**/
void Bar::some_method1()
{
     typedef class Foo::inner_class inner_class_;
     /*не важно*/
}

вот тут примерно то же самое.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Orlan
Дата 18.1.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

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



Ясно, прийдется использовать производный класс только в телах методов. Спасибо.
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
LuckLess
Дата 18.1.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



попробуйте так
Код

template <class inner_class_>
class A 
{
    
};
class B : public A<inner_class >
{
public:
    class inner_class 
    {
    };
};

или так
Код

template <typename T>
class A 
{
    typedef T inner_class_;
};
class B : public A<inner_class>
{
public:
    class inner_class 
    {
    };
};
//typedef B::inner_class inner_class;

PM MAIL   Вверх
Mayk
Дата 18.1.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Можно использовать еще такой трюк:
Код

template <class T>
class A 
{
    //typedef typename T::inner_class inner_class_;
    class Defs{ //← добавлено
        typedef typename T::inner_class inner_class_;
    }; //← добавлено

    void some_method2()
    {
        Defs::/*← добавлено*/inner_class_* s;
    }
};
//↓↓↓ без изменений ↓↓↓
class B : public A<B>{public:    class inner_class     {};};



Это сообщение отредактировал(а) Mayk - 18.1.2006, 20:17


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Orlan
  Дата 19.1.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

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



LuckLess, к сожаленью inner_class не определен в момент обработки строки:
Цитата(LuckLess @ 18.1.2006, 19:23)

Код

class B : public A<inner_class >


Mayk, а можно и так написать, что будет в данном случае даже проще:
Цитата(Mayk @ 18.1.2006, 20:10)

Код

    void some_method2()
    {
        Defs::inner_class_* s;
        T::inner_class * s2;/*← добавлено*/
    }

Хотя сам трюк с Defs весьма интересен smile
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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