Во-первых, я думаю, что код, близкий к правильному:
template<typename T> struct A {
auto func()
-> decltype(static_cast<T*>(this)->func())
{
return static_cast<T*>(this)->func();
}
};
class B : public A<B> {
void func(){
}
};
Как указал Мотти. Однако, что все еще терпит неудачу, и я думаю по той причине, что возвращаемый тип базы должен быть известен, когда B
отклонен для наследования от A<B>
, но, поскольку B
еще не определено , это становится проблемой курицы и яйца.
Тем не менее, это может быть наконец возможно в C++1y
с помощью простого auto
(без decltype
), я пытался с gcc-4.8.2
template<typename T> struct A {
auto func()
//c++1y// -> decltype(static_cast<T*>(this)->func())
{
return static_cast<T*>(this)->func();
}
};
class B : public A<B> {
void func(){
}
};
Компилирует (c++ -std=c++1y
) и запускает:
int main(){
B b; b.func();
}
Два отказа от ответственности: я не знаю, почему это работает. Я не знаю, насколько это стандартно.