Visual Studio 2008 не заботится о существовании базового класса при компиляции шаблонов? - PullRequest
2 голосов
/ 04 марта 2011

Кажется, что VS 2008 обрабатывает шаблоны классов с наследованием немного иначе, чем другие компиляторы.Следующий код компилируется без ошибок на VS 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 оправдывает такое поведение?

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Это, скорее всего, является следствием того факта, что visual studio выполняет поиск по имени одной фазы, когда она должна выполнять две фазы.Независимое имя «non_existent_class» должно завершиться неудачей на первом этапе, который происходит в момент определения того, был ли когда-либо создан экземпляр шаблона.

Это ошибка, но она никогда не возникаетисправляется до тех пор, пока MS не изменит принципиально работу их компилятора с шаблонами.

http://womble.decadent.org.uk/c++/template-faq.html#two-phase

http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html

0 голосов
/ 04 марта 2011

Когда вы говорите, что компилятор принимает этот код, а другие компиляторы этого не делают, вы имеете в виду этот фрагмент кода или создание экземпляра шаблона?

Шаблоны не компилируются, когда встречается определение,а точнее, когда они созданы.Если вы не создаете экземпляр шаблона, может случиться так, что компилятор полностью игнорирует все определение шаблона (настолько, насколько это возможно, так как он должен иметь возможность интерпретировать достаточно кода, чтобы знать, когда определение шаблона заканчивается).

Затем, на более позднем этапе, если шаблон действительно создан, и при условии, что для шаблона нет специализации, компилятор будет жаловаться.Обратите внимание, что если вы предоставляете специализацию для определенного типа, эта специализация не должна наследоваться от того же несуществующего класса.

В этом конкретном случае я склонен думать, что это связано со специальным(как в нестандартной) обработке, которую компилятор Microsoft делает с зависимыми именами.Точно так же, как вам не нужно указывать typename перед зависимым именем внутри шаблона (например, базовый класс или создание другого шаблона с аргументом типа этого шаблона), компилятор можетучтите, что базовый класс будет определен до того, как произойдет фактическое создание экземпляра, и дождитесь этого момента, чтобы выполнить проверку.

0 голосов
/ 04 марта 2011

Компилятор Visual Studio никогда не славился своим соответствием стандартам. Это должно быть еще одна ошибка, которая, в случае, если вы сообщите об этом, они скажут вам, что у них есть более важные дела. Само собой разумеется, что как только вы создадите экземпляр класса, компилятор выдаст ошибку.

Да, есть вещи, которые компилятор не может диагностировать до создания экземпляра. Это не входит в их число, и компилятор должен выдать диагностику. C ++ 0x не меняет это правило

...