Следующий код в MSVC 2008 компилится:
template <typename S, typename T>
class someclass : public non_existent_class
{
T operator() (S s) const {
return T(s);
}
};
Вопрос — а должен? Ни один другой компилятор из проверенных (GCC 4.5.0, Intel, Online Comeau, VS 2005) не скомпилировал с вполне логичной ошибкой об отсутствии "non_existent_class". Возможно, в C++0x есть что-то, объясняющее данное поведение?
(x-posted on
stackoverflow.com)
19.03.11 16:46: Перенесено модератором из 'C/C++. Прикладные вопросы' — Odi$$ey
Здравствуйте, eramart, Вы писали:
E>Следующий код в MSVC 2008 компилится:
E>E>template <typename S, typename T>
E>class someclass : public non_existent_class
E>{
E>T operator() (S s) const {
E> return T(s);
// you can replace it with something like: return abrakadabra(s);
E>}
E>};
E>
E>Вопрос — а должен? Ни один другой компилятор из проверенных (GCC 4.5.0, Intel, Online Comeau, VS 2005) не скомпилировал с вполне логичной ошибкой об отсутствии "non_existent_class". Возможно, в C++0x есть что-то, объясняющее данное поведение?
Очень просто. Ты не используешь этот класс. Любой template класс генерируется в месте использования. Нет ни какой причины не компилировать этот код.
Давай поставлю тебя на место компилятора. Вот ты компилируешь cpp и встречаешь в одном из включённых файлов такой класс. Выдать ошибку?
1. Если да(выдать). То что делать с другим cpp в котором сначала включён файл с реализацией non_existent_class, а потом уже использование someclass. Такое должно быть валидным.
2. Если нет(не выдавать). То так и на каждый другой не будет смысла выдавать ошибку. (это ожидаемое поведение)
Вывод: либо ты компилировал разный код в разных компиляторах. в ( GCC 4.5.0, Intel, Online Comeau, VS 2005) добавил ещё и использование.
либо баг скорее в них, а не в VS 2008.
Здравствуйте, Caracrist, Вы писали:
C>Очень просто. Ты не используешь этот класс. Любой template класс генерируется в месте использования. Нет ни какой причины не компилировать этот код.
Просто студия не использует двухфазный поиск. Остальные перечисленные компиляторы (Comeau и GCC точно) анализируют шаблон, даже если он не используется.
C>либо баг скорее в них, а не в VS 2008.
В них бага нет, они работают по стандарту. В студии отказались от двухфазного поиска.
Подробнее про это можно узнать, например, в книжке "Шаблоны С++. Справочник разработчика" Джосаттиса и Вандервуда.