为什么一个类不能从decltype的结果继承?

时间:2012-02-20 21:56:31

标签: c++ inheritance c++11 decltype

为什么类不能在继承列表中有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 个答案:

答案 0 :(得分:19)

允许:

10.1:“可以使用符号在类定义中指定基类列表:”

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

所以我猜你的编译器有错误

答案 1 :(得分:10)

看起来像a bug in GCC。尝试4.7。

答案 2 :(得分:3)

解决方法:

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

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

答案 3 :(得分:-2)

您可以尝试类似

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

虽然它可能期望该语法的静态成员函数,但它可能遇到阻止decltype工作的相同错误。