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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование частично специализированного шаблона, производный шаб. не видит полей родителя 
V
    Опции темы
georain
Дата 31.1.2008, 11:25 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть класс - шаблон с двумя специализациями
Другой класс - шаблон  наследует одну из специализаций в зависимости от своих параметров
Неспециализированный класс не определён

В нижеприведённом коде члены класса base не декларированы в классе derived, почему? 
(то что специализации почти одинаковые не обращайте внимания, это сделано для упрощения приведённого кода)

(компиляторы gcc4.1 и icc10.0)

Код

    // шаблон для специализации (пустой)
    template<typename Type, typename Date, bool>
    class base;

    // специализация если sizeof(Type) >= sizeof(Date)
    template<typename Type, typename Date>
    class base<Type, Date, false>
    {
        public:
        Type type;
        Date date;

    };

    // специализация если sizeof(Type) < sizeof(Date)
    template<typename Type, typename Date>
    class base<Type, Date, true>
    {
        public:
        Date date;
        Type type;
    };

template<typename Type, typename Date>
class derived: public base<Type, Date, (sizeof(Type) < sizeof(Date))> {
    public:
        inline const Date & getDate(){
            return date;
        };
        inline const Date & getType(){
            return type;
        };
};


Это сообщение отредактировал(а) georain - 23.1.2009, 19:52
PM MAIL   Вверх
Lazin
Дата 31.1.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



а ты вместо
Код

    // шаблон для переспециализации (пустой)
    template<typename Type, typename Date, bool>
    class base{
        //конструктор в секции private
        private: base(){};
        //этот класс не должен создаваться
    };


напиши
Код

    // шаблон для переспециализации (пустой)
    template<typename Type, typename Date, bool>
    class base;

PM MAIL Skype GTalk   Вверх
georain
Дата 31.1.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Неа, не помогает. Тоже самое.
PM MAIL   Вверх
Lazin
Дата 31.1.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



visual studio 8 это компилирует на ура..
что пишет компилятор?
PM MAIL Skype GTalk   Вверх
archimed7592
Дата 31.1.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



14.6.2/3
Цитата

In the definition of a class template or a member of a class template, if a base class of the class template
depends on a template-parameter, the base class scope is not examined during unqualified name lookup
either at the point of definition of the class template or member or during an instantiation of the class template
or member.

Нужно this->type/base::Type.

Добавлено через 1 минуту и 50 секунд
Цитата(Lazin @  31.1.2008,  12:49 Найти цитируемый пост)
visual studio 8 это компилирует на ура..

MSVC плохо соответствует Стандарту... После него часть кода приходится переделывать :(.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
georain
  Дата 31.1.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Точняк! archimed7592, вновь спасибо! smile

Надо перед всеми переменными поставить
Код

base<Type, Date, (sizeof(Type) < sizeof(Date))>::

или
Код

this->


Это сообщение отредактировал(а) georain - 31.1.2008, 14:00
PM MAIL   Вверх
archimed7592
Дата 31.1.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(georain @  31.1.2008,  13:59 Найти цитируемый пост)
Надо перед всеми переменными поставить

Лучше сделать typedef ... Base; в class-scope(со спецификатором доступа private).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
null56
Дата 15.1.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это получается стандарт с++ и такой код будет переносим на любые компиляторы, соответствующие этому стандарту, включая вижуал студио?

И еще вопросик, данной утверждение относится только для наследования от шаблона?
Когда класс наследуется от обычного класса по стандарту необходимость явного указания базового класса или указателя this отпадает?

Код

template <class T>
class Base
{
    protected:
    T value;
}

template <class T>
class Child : public Base
{
 void myFunc() {this->value;}
}

PM MAIL   Вверх
Kallikanzarid
Дата 15.1.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



null56, в твоем коде много причин для не-компиляции smile

PM MAIL   Вверх
null56
Дата 15.1.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Kallikanzarid, при чем тут мой код?

Вопрос стоит в обращении к переменным базового шаблонного класса и обычного... и как это верно делать по стандарту, а не МВС
PM MAIL   Вверх
vinter
Дата 16.1.2009, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



ненужен там this


--------------------
Мой блог
PM MAIL WWW   Вверх
null56
Дата 16.1.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



без this, вот чего происходит
Код

template <class T>
class TBasePointer
{
    public:
        inline bool isNull() {return (m_pPointer == 0);}
        inline T * relinquish() {T * p_pointer = m_pPointer; m_pPointer = 0; return p_pointer;}
        //-
        bool operator !() {return isNull();}
        //-
        T * m_pPointer;
};

template <class T>
class TPointer :  public TBasePointer<T>
{
    public:
        TPointer() : TBasePointer<T>() {}
        TPointer(T * pPointer) : TBasePointer<T>(pPointer) {}
        //-
        void destroy() {if (!isNull()) {delete m_pPointer; m_pPointer = 0;}}
};


Вывод получаем
Код

/pointer.h:34: error: there are no arguments to ‘isNull’ that depend on a template parameter, so a declaration of ‘isNull’ must be available
./pointer.h:34: error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
./pointer.h:34: error: ‘m_pPointer’ was not declared in this scope


То есть обратиться можно только через явное указание базового класса, либо через this
PM MAIL   Вверх
null56
Дата 16.1.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Цитата(georain @  31.1.2008,  13:59 Найти цитируемый пост)
Надо перед всеми переменными поставить

Лучше сделать typedef ... Base; в class-scope(со спецификатором доступа private). 


а как это реализовать?
PM MAIL   Вверх
vinter
Дата 16.1.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(null56 @  16.1.2009,  11:02 Найти цитируемый пост)
Вывод получаем

VS2008 собирает


--------------------
Мой блог
PM MAIL WWW   Вверх
UnrealMan
Дата 16.1.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @  16.1.2009,  19:10 Найти цитируемый пост)
VS2008 собирает 

Вывод: VC++ нарушает стандарт.

Код
#include <iostream>

enum { value = 1 };

template <class T>
struct B
{
    enum { value = 2 };
};

template <class T>
struct D : B<T>
{
    static void f() { std::cout << value << std::endl; }
};


int main()
{
    D<void>::f();
}

Стандарт требует, чтобы такая программа выводила 1, а не 2.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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