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

Sco*_*son 5 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
Run Code Online (Sandbox Code Playgroud)

编译以下代码时:

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:
  ...
};
Run Code Online (Sandbox Code Playgroud)

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;
    }
  }
...
Run Code Online (Sandbox Code Playgroud)

谢谢.

编辑:对不起,如果不清楚哪一行是24号.它由Node.h摘录中的"Offending line"注释表示.

Jon*_*ely 4

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

GCC 4.4.0 近五年前已更改(请参阅Bug 57)以接受代码,您有充分的理由使用这么旧的版本吗?

如果无法升级,可以通过向 Node 添加 typedef 来解决该错误:

typedef Vector<T, dimensions> VectorType;
Run Code Online (Sandbox Code Playgroud)

然后使用它:

  Node( Id id,
        QString& name,
        QString& text = "",
        VectorType position = VectorType(),
        Quaternion<T> rotation = Quaternion<T>() )
Run Code Online (Sandbox Code Playgroud)

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