成员初始值设定项不命名非静态数据成员

Posted

技术标签:

【中文标题】成员初始值设定项不命名非静态数据成员【英文标题】:Member initializer does not name a non-static data member 【发布时间】:2013-10-02 12:14:52 【问题描述】:

我是 C++ 新手,并试图让一个开源 C++ 项目在 x 代码中编译。这段代码的最后两行:

template<typename T>
struct TVector3 : public TVector2<T> 
    T z;
TVector3(T _x = 0.0, T _y = 0.0, T _z = 0.0)
    : TVector2(_x, _y), z(_z)

正在抛出错误:成员初始化程序没有命名非静态数据成员

基于 (member initializer does not name a non-static data member or base class),我尝试将代码更改为:

template<typename T>
struct TVector3 : public TVector2<T> 
    T z;
TVector3(T _x = 0.0, T _y = 0.0, T _z = 0.0)
    : TVector2(_x, _y) 
 z(_z);

但我遇到了同样的错误。这是超类 Vector2 的代码。我该如何解决这个错误?

struct TVector2 
    T x, y;
    TVector2(T _x = 0.0, T _y = 0.0)
        : x(_x), y(_y)
    
    double Length() const 
        return sqrt(static_cast<double>(x*x + y*y));
    
    double Norm();
    TVector2<T>& operator*=(T f) 
        x *= f;
        y *= f;
        return *this;
    
    TVector2<T>& operator+=(const TVector2<T>& v) 
        x += v.x;
        y += v.y;
        return *this;
    
    TVector2<T>& operator-=(const TVector2<T>& v) 
        x -= v.x;
        y -= v.y;
        return *this;
    
;

【问题讨论】:

【参考方案1】:

在类模板中,只注入它自己的名称以供在没有模板参数的情况下使用。你需要这个:

template<typename T>
struct TVector3 : public TVector2<T> 
    T z;
TVector3(T _x = 0.0, T _y = 0.0, T _z = 0.0)
    : TVector2<T>(_x, _y), z(_z)

【讨论】:

以上是关于成员初始值设定项不命名非静态数据成员的主要内容,如果未能解决你的问题,请参考以下文章

类定义中的静态数据成员初始化?

静态常量(非整数)成员初始化语法背后的基本原理?

成员初始化器列表和非静态数据成员的默认成员初始化器有啥区别?

c2797 未实现成员初始化器列表或非静态数据成员初始化器内的列表初始化

在 C++0x 中,非静态数据成员初始化器会覆盖隐式复制构造函数吗?

将 const char[] 初始化为非静态类成员