[英]Clang complains that a POD class is actually non-POD
更新:我已经在这里修改了代码,以便您可以直接将其插入并尝试编译。
Clang 3.4.1(LLVM 3.4)抱怨在可变参数函数中使用我的类不是POD类型(据我所知是绝对不是)。 G ++对此没有问题。
即使按C ++ 03的标准,该类也是POD:
C ++ 11关于“ POD”的规则已经放宽了,那么这是怎么回事?
关于代码:这是矢量的模板类(如矢量图形中一样),可变参数函数仅用于将一些任意数据填充到数组中。
我的班级头文件:
template<typename TYPE>
class Vec3t;
typedef Vec3t<float> Vec3f;
template<typename TYPE>
class Vec3t {
public:
Vec3t<TYPE>( void ){}
Vec3t<TYPE>( const TYPE nx, const TYPE ny, const TYPE nz ){}
Vec3t<TYPE> operator-(void) const{}
Vec3t<TYPE> operator*( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator*( const TYPE val ) const{}
Vec3t<TYPE>& operator*=( const Vec3t<TYPE> &other ){}
Vec3t<TYPE>& operator*=( const TYPE val ){}
Vec3t<TYPE> operator+( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator+( const TYPE val ) const{}
Vec3t<TYPE>& operator+=( const Vec3t<TYPE> &other ){}
Vec3t<TYPE>& operator+=( const TYPE val ){}
Vec3t<TYPE> operator-( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator-( const TYPE val ) const{}
Vec3t<TYPE>& operator-=( const Vec3t<TYPE> &other ){}
Vec3t<TYPE>& operator-=( const TYPE val ){}
Vec3t<TYPE> operator/( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator/( const TYPE val ) const{}
Vec3t<TYPE>& operator/=( const TYPE val ){}
Vec3t<TYPE>& operator/=( const Vec3t<TYPE> &other ){}
bool operator==( const Vec3t<TYPE> &b ) const {}
bool operator==( const TYPE b ) const {}
bool operator!=( const Vec3t<TYPE> &b ) const {}
bool operator!=( const TYPE b ) const {}
Vec3t<TYPE>& Set( const TYPE a, const TYPE b, const TYPE c ){}
Vec3t<TYPE>& Set( const TYPE a, const TYPE b ){}
void Cross( const Vec3t<TYPE> &other, Vec3t<TYPE> &out ) const{}
TYPE Dot( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> PerpCCW_ZAxis( void ){}
Vec3t<TYPE> PerpCW_ZAxis( void ){}
float Len( void ) const{}
void Zero( void ){}
static void Cross( const Vec3t<TYPE> &other, const Vec3t<TYPE> &u, Vec3t<TYPE> &out ){}
Vec3f Normalize( void ){}
Vec3f Rotation( TYPE angle ){}
float DegreesBetween( const Vec3f &other ){}
float RadiansBetween( const Vec3f &other ){}
Vec3f Rotate( float angle, const bool inRadians = false ){}
static float Len( const Vec3f &other ){}
public:
TYPE x,y,z;
};
template< typename TYPE >
void FillArray( const std::size_t count, TYPE* var, ... ) {
va_list vargs;
va_start( vargs, var );
for ( std::size_t i=0; i<count; i++ ) {
var[i] = va_arg( vargs, TYPE ); // ** THIS IS THE LINE CLANG ERRS ON ** //
}
va_end( vargs );
}
我的可变参数函数头文件:
#include <cstdarg>
template< typename TYPE >
void FillArray( const std::size_t count, TYPE* var, ... ) {
va_list vargs;
va_start( vargs, var );
for ( std::size_t i=0; i<count; i++ ) {
var[i] = va_arg( vargs, TYPE ); // ** THIS IS THE LINE CLANG ERRS ON ** //
}
va_end( vargs );
}
铛的错误:错误:'va_arg'的第二个参数是非POD类型的'Vec3t'[-Wnon-pod-varargs]
使用这些示例的示例程序会导致Clang错误:#include“ fillarray.h”
int main ( void ) {
Vec3t<float> v[2];
FillArray< Vec3t<float> >( 2, v, 0.4f, 0.5f);
}
编译为:clang ++ x.cpp -I / usr / include / i386-linux-gnu / c ++ / 4.8 -std = gnu ++ 11
§12.1/ 7:
如果默认构造函数不是由用户提供的,则它是微不足道的。
否则,默认构造函数为non-trivial 。
根据定义,您已声明的默认构造函数很重要。
§9/ 3:
普通类是具有普通默认构造函数(12.1)且可普通复制的类。
由于默认构造函数不是平凡的,所以该类也不是平凡的。
第9/10条:
POD结构是一个非联合类,既是一个琐碎的类又是一个标准布局的类...
由于该课程并不简单,因此不符合POD的资格。 为了使其成为POD,您必须摆脱默认的构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.