5

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

任何人都可以解释为什么我会收到错误:

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

编译以下代码时:

节点.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:
  ...
};

矢量.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 摘录中的“违规行”注释指示。

4

1 回答 1

4

不幸的是,我认为标准实际上说此代码格式错误,请参阅核心问题 325。C++ 语法说,默认参数的模板参数列表中的逗号被解析为开始下一个函数参数,因此问题= Vector<T, dimensions>()出在代码中,因此dimensions被视为开始一个新的函数参数,而不是作为模板 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,而不是每次使用它。

于 2013-01-13T19:11:01.630 回答