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

C++ 非类型模板参数错误(';x';不是类型),c++,gcc,g++,C++,Gcc,G++,我正在尝试为我朋友的QT应用程序构建一个OSX版本,他是在Windows和Linux上构建的。我们都在使用g++。我使用的是GCC4.2.1。不幸的是,我不知道他在构建应用程序时使用了什么版本(那是很久以前的事了) 有谁能解释一下我为什么会出错: ../../../src/dbapi/dbcore/node.h:24: error: 'dimensions' is not a type 编译以下代码时: 节点h: template<class T,const unsigned int d

我正在尝试为我朋友的QT应用程序构建一个OSX版本,他是在Windows和Linux上构建的。我们都在使用g++。我使用的是GCC4.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:
  ...
};
模板
类导出\u DBCORE节点:公共转换
{
公众:
节点(Id,
q字符串和名称,
QString&text=“”,
//*************违规线路:***************
向量位置=向量(),
四元数旋转=四元数()
:变换(位置、旋转)
,中(id)
,mName(姓名)
,多行文字(纯文字)
{
}
私人:
...
};
向量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;
    }
  }
...
模板
类导出核心向量
{
公众:
//!默认构造函数
向量()
{
mpArray=新T[尺寸];
对于(int i=0;i
谢谢


编辑:抱歉,如果不清楚哪一行是24号。它由“违规行”指示遗憾的是,我认为这个标准实际上是说这个代码是不正确的,参见。C++语法说明在默认参数的模板参数列表中逗号被解析为启动下一个函数参数,所以问题在<代码> =向量()中。
代码位,因此
维度
被视为启动新功能参数,而不是模板id的一部分

GCC4.4.0在将近五年前被修改(请参阅)以接受该代码,您有充分的理由使用这样一个旧版本吗

如果无法升级,则可以通过向节点添加typedef来解决此错误:

typedef Vector<T, dimensions> VectorType;
typedef向量向量类型;
然后用这个:

  Node( Id id,
        QString& name,
        QString& text = "",
        VectorType position = VectorType(),
        Quaternion<T> rotation = Quaternion<T>() )
节点(Id,
q字符串和名称,
QString&text=“”,
VectorType位置=VectorType(),
四元数旋转=四元数()

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

你能告诉我们代码片段中的哪一行是第24行吗?你是否在
节点
头文件中包含了
向量
头文件?当Qt和标准库都有很好的工作类时,为什么要使用你自己的向量类?gcc 4.2.1是你最近使用的编译器吗有吗?如果您切换到最新版本的clang,它可能会起作用,或者您会收到更好的错误消息。@PeteBecker抱歉,它不太清楚。它在我的Node.h摘录中用星号填充的注释表示。@JoachimPileborg是的。我只是遗漏了很多文件。我没有编写此代码,我不确定为什么会这样做。@bames53是的,但是我会尝试其他版本。不过,知道问题的根源会很好。是做错了什么,还是只是编译器的问题?@BoPersson不确定,我在没有
const
的情况下尝试了它,但仍然得到了相同的结果。顺便说一句,我在这里看到了QString,这通常意味着你正在使用QT。不要将模板与QT结合使用,这对我来说很重要升级moc过程。非常好的解释,谢谢。我正在使用MacPorts 2.7版本,问题已经解决。我使用4.2.1是因为它与Xcode捆绑在一起。我认为Xcode附带的任何东西对OS X开发来说都是最稳定的。不,Xcode附带的是最新的GPLv2版本。苹果不会hip更新版本是出于许可原因,而非技术原因或稳定性原因。