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

Обновлено ниже .
Ниже приведен весь код, который у меня есть в моем main.cpp:

template
struct other_traits;

template
struct some_traits{
    typedef decltype(&T::operator()) Fty;
    typedef typename other_traits::type type;
};

int main(){
}

Но я получаю следующие ошибки с Visual Studio 2010, в то время как g ++ компилируется отлично :

src \ main.cpp (9) : ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'type'
--src \ main.cpp (10): см. ссылку на создание экземпляра шаблона класса ' some_traits ' в процессе компиляции
src \ main.cpp (9): ошибка C2868: ' some_traits :: type ': недопустимый синтаксис для объявления-использования; ожидаемое квалифицированное имя

(мне нравится это последнее, полная фигня.)

Могу ли я принять это как ошибку в VC10 или есть какие-то веские причины для раннего создания экземпляра? Или это ошибка с decltype , которая заставляет компилятор думать, что Fty не является зависимым именем?


Обновление : Я пытался обмануть компилятор, думая, что Fty - это зависимое имя, использующее базовый класс для наследования:

template
struct other_traits;

template
struct other_traits{
    typedef R type;
};

template
struct base_traits{
    typedef typename other_traits::type type;
};

template
struct some_traits
    : public base_traits
{};

Но компилятор по-прежнему пытается создать / скомпилировать все на месте, выдавая следующие ошибки:

src\main.cpp(13): error C2039: 'type' : is not a member of 'other_traits'
          with
          [
              T=
          ]
          src\main.cpp(19) : see reference to class template instantiation 'base_traits' being compiled
          with
          [
              Fty=
          ]
          src\main.cpp(19) : see reference to class template instantiation 'some_traits' being compiled
src\main.cpp(13): error C2146: syntax error : missing ';' before identifier 'type'
src\main.cpp(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
src\main.cpp(13): error C2602: 'base_traits::type' is not a member of a base class of 'base_traits'
          with
          [
              Fty=
          ]
          src\main.cpp(13) : see declaration of 'base_traits::type'
          with
          [
              Fty=
          ]
src\main.cpp(13): error C2868: 'base_traits::type' : illegal syntax for using-declaration; expected qualified-name
          with
          [
              Fty=
          ]

Обратите внимание, что параметры шаблона равны пусто . Есть идеи?

15
задан Flexo 19 December 2011 в 15:46
поделиться