非类型模板参数错误("x"不是类型)
Non-type template parameter error ('x' is not a type)
我正在尝试构建我朋友的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。这通常更短,这意味着如果你改变了容器,那么你通常只需要更新类型定义,而不是每次使用它。
相关文章:
- 类没有命名C++代码中的类型错误
- 不完整类型错误(E0409、E0070、E0515)
- 使用具有结构不完整类型错误的模板
- 不命名构造函数和析构函数上的类型错误
- 返回派生类型时出现协变类型错误
- 为什么此构造函数没有给出不完整的类型错误?
- 定义模板化结构的特征时出现不完整的类型错误
- 使用重载构造函数时出现不完整的类型错误
- 为什么我得到表达式必须有类类型错误?
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 枚举成员不是类型错误
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 非默认析构函数会导致不完整的类型错误
- 为什么按引用传入会导致绑定引用类型错误
- Objective-C C++ 包装器 类型错误的不完整定义
- 输入类型错误
- 当构造函数的参数类型错误时引发异常
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- C UNWORKOWN类型错误