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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонные параметры и шаблонные шаблонные параметр, Проблема 
:(
    Опции темы
Гость_Maxim
Дата 16.10.2005, 17:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте, у меня такой вопрос, почему код
Код

template<class T, template<class> class C> class Base
{
protected:
    C<T>* pointer;
};

template<class T> class Derived: protected Base<T,Derived>
{
public:
    void F()
    {
        Derived<T>* p=Base<T,Derived>::pointer; //12 строка
    }
};

int main()
{
    return 0;
}

не компилируется с ошибкой в 12 строке:
Цитата

error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, template<class> class C> class Base’

но код
Код

template<class T, class C> class Base
{
protected:
    C* pointer;
};

template<class T> class Derived: protected Base<T,Derived<T> >
{
public:
    void F()
    {
        Derived<T>* p=Base<T,Derived<T> >::pointer;
    }
};

int main()
{
    return 0;
}

удачно компилируется, хотя вроде бы он делает то же, что и первый
ps. Компилятор g++ 4.0
  Вверх
nikitao
Дата 16.10.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



В ошибке все написано:
Должен быть определен 2 парметр в... классе Base.
У тебя написано:
Код

Base<T,Derived>::pointer;

Но Derived сам требует "пораметра" т к сам шаблон.
Во втором случае все впорядке.

Это сообщение отредактировал(а) nikitao - 16.10.2005, 18:05


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Void
Дата 16.10.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Не должен компилироваться ни первый, ни второй вариант. Второй параметр шаблона Base должен быть шаблоном, а не его специализацией. Чтобы получить доступ к нему из scope класса Derived, надо записать так:
Код

Derived<T> *p = Base<T, ::Derived>::pointer;

Проверял на Comeau. VC++ 8.0b2 позорно компилирует оба варианта. А g++ 3.4.2 повел себя молодцом.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
nikitao
Дата 16.10.2005, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Цитата
VC++ 8.0b2 позорно компилирует оба варианта

Позор!
Но ведь ое должен компилить только до тех пор пока мы не создадим обьект класса Derived в исполняймой части.


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Void
Дата 16.10.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



nikitao
+1
При попытке создать экземпляр Derived, VC начинает ругаться как положено. Ну что ж, такова специфика этого компилятора.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Guest
Дата 16.10.2005, 19:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

Derived<T> *p = Base<T, ::Derived>::pointer;

работает, спасибо
  Вверх
srd
Дата 16.10.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Вижуал действительно отличается поразительной ленивостью в отношении шаблонов. Например:
Код

// Это тоже будет компилироваться успешно, пока мы не попытаемся где-нибудь вызвать функцию f()
template<int> void f(void)
{
    qqqqqqqqqqqqqqqqqqqqqqqqqq
    wwwwwwwwwwwwwwwwwwwwwwwwww
    eeeeeeeeeeeeeeeeeeeeeeeeee    
}

int main(void)
{
}




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
nikitao
Дата 17.10.2005, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Короче VC не проверяет шаблон на правельность до тех пор пока не создается обьект этого шаблона.


Это сообщение отредактировал(а) nikitao - 17.10.2005, 17:31


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
LPBOY
Дата 17.10.2005, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Void @ 16.10.2005, 18:08)
Чтобы получить доступ к нему из scope класса Derived, надо записать так:
Код

Derived<T> *p = Base<T, ::Derived>::pointer;


Круто, конечно smile но я чем больше смотрю на это, тем меньше понимаю... smile
Объяснения из книги Вандевурда/Джосаттиса еще больше запутали... smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Void
Дата 17.10.2005, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



LPBOY
Да я сам фактически методом тыка после курения Стандарта (14.6) дошел smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
nikitao
Дата 18.10.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Цитата
Да я сам фактически методом тыка после курения Стандарта (14.6) дошел


После таких методов Microsoft и выпускает ОСИ для которых потом довыпускает еще патчей на 300 метров.Также главное чтоб откомпилилось,а че это означает они нема smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Void
Дата 18.10.2005, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



nikitao
Но-но! smile
C++ RSDN гуру мои домыслы подтверждают smile



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
LPBOY
Дата 18.10.2005, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Void, да ты точно объяснил smile

Цитата(Void @ 16.10.2005, 18:08)
Второй параметр шаблона Base должен быть шаблоном, а не его специализацией.


Просто я в другом смысле понял слово "специализация". Слишком много у него смыслов...
--------------------
Каждый человек по-своему прав, а по-моему нет...
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.1897 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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