在模板类中声明的struct成员失败
decltype fails on struct member declared in template class
我对我正在使用的外部库未编译的代码有一个问题。我相信图书馆可以通过GCC编译罚款,但没有用Clang编译。
我可以如下重新创建问题
template <class T>
class A {
public:
struct B {
int a;
};
void test();
private:
T _t;
};
template <class T>
void A<T>::test()
{
printf("Result %d", std::numeric_limits<decltype(B::a)>::max());
}
int main(int argc, char** argv)
{
auto t = A<int>();
t.test();
return 0;
}
这无法在Clang上编译以下错误
error: invalid use of non-static data member 'a' printf("Result %d", std::numeric_limits<decltype(B::a)>::max());
我的问题如下:
预期行为是什么?
在C 11中添加了非静态成员的声明。这适用于模板类中声明的人吗?
这是编译器错误吗?或使用GCC?
的不合格代码的示例
它是旧版本的错误,并将其固定在clang 3.9.0:https://godbolt.org/g/zqfxl2
规范性标准:
8.2.3:在某些情况下,出现未评估的操作数([Expr.prim.req], [expr.typeid],[expr.sizeof],[expr.unary.noexcept], [dcl.type.simple] ,[temp](。未评估未评估的操作数。 [注意:在未评估的操作数中,非静态类成员可能是 命名([Expr.prim](和对象或函数的命名,不是通过 本身,要求提供一个定义([BASIC.DEF.ODR](。一个 未评估的操作数被认为是全表达。 - 终注]
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- C 如何推动vector struct的成员
- 在模板类中声明的struct成员失败
- 使用struct作为成员功能的包装器
- 使用struct成员抛出bad_alloc创建地图
- 'struct std::string'没有名为'c_string'的成员
- 使用struct作为私有成员在链接列表类中定义ListNode
- 作为struct成员的Std::unordered_map的地址为0
- 在struct[]中分配char*指针值(结构成员)的最优化方法
- 为结构成员分配的内存是连续的吗?如果struct成员是数组呢?
- 为什么boost::fusion序列中的struct数组成员类型不能正确推导
- 通过struct将参数传递给CreateThread(),并在不影响前面线程的情况下更改后续线程的成员
- 将struct的成员声明为uint32_t时额外的字节
- 'struct std::pair<int, int>'没有名为'serialize'的成员
- 带有位域成员变量的Struct
- 结构成员之前"struct"和缺少"struct"单词有什么区别
- 是否可以有一个std::vector of struct和一个fexible数组成员
- 在c++中使用全局函数的struct成员的方法