CRTP не работает с decltype

template<typename T> struct A {
    auto func() -> decltype(T::func()) {
        return T::func();
    }
};
class B : public A<B> {
    void func() {
    }
};

Мне кажется довольно простым. Но MSVC не компилируется.

visual studio 2010\projects\temp\temp\main.cpp(4): error C2039: 'func' : is not a member of 'B'
visual studio 2010\projects\temp\temp\main.cpp(8) : see declaration of 'B'
visual studio 2010\projects\temp\temp\main.cpp(8) : see reference to class template instantiation 'A<T>' being compiled
          with
          [
              T=B
          ]
visual studio 2010\projects\temp\temp\main.cpp(4): error C3861: 'func': identifier not found

Даже если компилятор с радостью примет вызов функции. Приведенный ниже пример компилируется нормально.

template<typename T> struct A {
    void func() {
        return T::func();
    }
};
class B : public A<B> {
    void func() {
    }
};

У меня такая же проблема при попытке использовать любые типы из аргумента шаблона.

template<typename T> struct A {
    typedef typename T::something something;
};
class B : public A<B> {
    typedef char something;
};

visual studio 2010\projects\temp\temp\main.cpp(4): error C2039: 'something' : is not a member of 'B'

В то время как класс B четко определяет тип, называемый «что-то». Компилятор вполне может вызывать функции для объекта типа T, T & или T *, но я не могу получить доступ к каким-либо типам из T.

5
задан Johannes Schaub - litb 2 October 2011 в 10:43
поделиться