非类型模板参数错误('x'不是类型)

时间:2013-01-11 16:38:18

标签: c++ gcc g++

我正在尝试构建我朋友的QT应用程序的OS X版本,这是他在Windows和Linux上构建的。我们都在使用g ++。我正在使用gcc 4.2.1。不幸的是,我不知道他在构建应用程序时使用了什么版本(很久以前)。

有没有人能说明我收到错误的原因:

../../../src/dbapi/dbcore/node.h:24: error: 'dimensions' is not a type

编译以下代码时:

Node.h:

template<class T,const unsigned int dimensions>
class EXPORT_DBCORE Node : public Transform<T,dimensions>
{
public:
  Node( Id id,
        QString& name,
        QString& text = "",
        // ************** Offending line: ***************
        Vector<T,dimensions> position = Vector<T,dimensions>(),
        Quaternion<T> rotation = Quaternion<T>() )
    : Transform<T,dimensions>( position, rotation )
    , mId( id )
    , mName( name )
    , mText( text )
  {
  }

private:
  ...
};

Vector.h:

template<class T,const unsigned int dimensions>
class EXPORT_DBCORE Vector
{
public:
  //! Default Constructor
  Vector()
  {
    mpArray = new T[dimensions];
    for( int i = 0; i < dimensions; i++ )
    {
      mpArray[i] = 0;
    }
  }
...

感谢。

编辑:很抱歉,如果不清楚哪一行是24号。它由Node.h摘录中的“违规行”评论表示。

1 个答案:

答案 0 :(得分:4)

不幸的是,我认为标准实际上说这段代码格式不正确,请参阅core issue 325。 C ++语法表示默认参数的模板参数列表中的逗号被解析为启动下一个函数参数,因此问题出现在代码的= Vector<T, dimensions>()位,因此dimensions被视为启动一个新的函数参数,而不是作为template-id的一部分。

GCC 4.4.0在近五年前发生了变化(见Bug 57)接受代码,您是否有充分的理由使用这样的旧版本?

如果您无法升级,可以通过向Node添加typedef来解决此问题:

typedef Vector<T, dimensions> VectorType;

然后使用:

  Node( Id id,
        QString& name,
        QString& text = "",
        VectorType position = VectorType(),
        Quaternion<T> rotation = Quaternion<T>() )

从技术上讲,只有默认参数需要使用typedef,但我会将它用于参数声明和默认参数。事实上,我几乎总是为我的类使用的任何容器类型声明一个typedef,然后在类中使用该typedef。这通常更短,意味着如果您更改容器,那么您通常只需要更新typedef,而不是每次使用它。