2013-01-11 47 views
5

我试图构建我的朋友的QT应用程序的OS X版本,他在Windows和Linux上构建了这个应用程序。我们都使用g ++。我正在使用gcc 4.2.1。不幸的是,我不知道他在构建应用程序时使用了什么版本(很早以前)。非类型模板参数错误('x'不是类型)

任何人都可以揭示为什么我收到错误一些轻:

../../../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摘录中的“Offending line”注释表示。

+1

你能否给我们提示代码段中的哪一行是第24行? –

+7

你在'Node'头文件中包含了'Vector'头文件吗?当Qt和标准库都有良好的工作类时,为什么要使用自己的矢量类? –

+4

是gcc 4.2.1最新的编译器吗?也许如果你切换到最近版本的铿锵声,它会工作,否则你会得到更好的错误信息。 – bames53

回答

3

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

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

typedef Vector<T, dimensions> VectorType; 

然后使用:

如果不能升级,你可以通过添加一个typedef到节点解决该漏洞

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

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

+0

很好的解释,谢谢。我正在使用MacPorts 2.7版本,问题已解决。 我正在使用4.2.1,因为这是与Xcode捆绑在一起的。我想,无论Xcode带来什么,对于OS X开发来说都是最稳定的。 –

+1

不,Xcode的最新版本是作为GPLv2许可的最后一个版本。由于许可原因,Apple不会推出新版本,而不是技术原因或稳定性原因。 –