gpt4 book ai didi

c++ - 非类型模板参数错误 ('x' is not a type)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:42 24 4
gpt4 key购买 nike

我正在尝试构建我 friend 的 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:
...
};

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

最佳答案

不幸的是,我认为标准实际上说这段代码格式错误,请参阅 core issue 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,而不是每次使用它。

关于c++ - 非类型模板参数错误 ('x' is not a type),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14282622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com