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

Non-type template parameter error ('x' is not a type)

本文关键字:类型 错误 参数      更新时间:2023-10-16

我正在尝试构建我朋友的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节选中的"违规行"注释指示。

不幸的是,我认为标准实际上说这段代码格式不良,参见核心问题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。这通常更短,这意味着如果你改变了容器,那么你通常只需要更新类型定义,而不是每次使用它。