Почему класс не может наследовать от результата decltype? - PullRequest
13 голосов
/ 21 февраля 2012

Почему класс не может иметь decltype в списке наследования?Например, я ожидал бы, что следующий код сделает A<B> наследуемым от RType, но с G ++ 4.6.1 (используя -std=c++0x) он не скомпилируется:

#include <type_traits>

template<typename T>
class A : public decltype(std::declval<T>().hello()) { };

class RType { };

class B {
public:
    RType hello() { return RType(); }
};

int main() {
    A<B> a;
}

Он дает следующеевывод:

test.cpp:6:18: error: expected class-name before 'decltype'
test.cpp:6:18: error: expected '{' before 'decltype'
test.cpp:6:54: error: expected unqualified-id before '{' token
test.cpp: In function 'int main()':
test.cpp:16:7: error: aggregate 'A<B> a' has incomplete type and cannot be defined

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

Ответы [ 4 ]

19 голосов
/ 21 февраля 2012

Разрешено:

10.1: "Список базовых классов может быть указан в определении класса с помощью записи:"

class-or-decltype:
nested-name-specifieropt class-name
decltype-specifier

, поэтому я полагаю, ваш компилятор имеет ошибку

10 голосов
/ 21 февраля 2012

Похоже, ошибка в GCC .Попробуйте 4.7.

3 голосов
/ 21 февраля 2012

Обходной путь:

template <typename T>
class ID
{
 public:
  typedef T type;
};

template<typename T>
class A : public ID<whatever>::type { };
0 голосов
/ 21 февраля 2012

Вы можете попробовать что-то вроде

template<typename T>
class A : public result_of<T::hello()>

хотя он может ожидать статическую функцию-член для этого синтаксиса, и он, скорее всего, столкнется с той же ошибкой, которая мешает работе decltype.

...