1

我有以下课程

template < int rows, int columns >
class Matrix
{
    //stuff
};

我正在执行以下操作:

typedef Matrix<4,4> Matrix3D;

但是,当我在另一个类中声明以下内容时出现错误:

class Transform3D
{
public:
    Matrix3D matrix;
        //some other stuff
};

我看到的错误是:

error C2146: syntax error : missing ';' before identifier 'matrix'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

所有这些都在第 7 行,即:

    Matrix3D matrix;

这是在 VS 2010 中。可能是什么问题?

4

2 回答 2

0

我只用一个文件创建了项目,它确实编译了

template < int rows, int columns >
class Matrix
{
   //stuff
};

typedef Matrix<4,4> Matrix3D; 

class Transform3D
{
public:
     Matrix3D matrix;
     //some other stuff
};

void main()
{
}

因此,我认为问题与预编译头文件的使用有关。您能详细介绍一下您的文件是如何组织的吗?

于 2012-04-19T05:31:50.140 回答
0

根据您的解释,我假设以下设置:

标准数据文件

// ..
typedef Matrix<4,4> Matrix3D; 
// ..

矩阵.h

template < int rows, int columns > class Matrix { /*...*/ };

变换.h

class Transform3d { Matrix3D matrix; /*...*/ };

变换.cpp

#include "stdafx.h"

如果是这种情况,Transform3D 类似乎不是 Matrix 模板的定义,(我希望 stdafx.h 中的 typedef 会生成编译错误,但我对 Visual Studio 中的预编译头文件不是很熟悉)。

您应该在文件 Transform.h 中#include 文件 Matrix.h 并从 Transform.h 中的 stdafx.h 移动 typedef。或者...您应该在 stdafx.h 中包含 Matrix.h,但只有当您的头文件足够稳定(以确保您仍然利用预编译的头文件)时,我才会这样做。

我的首选方式:

标准数据文件

// ..
// typedef Matrix<4,4> Matrix3D; -- removed from here
// ..

矩阵.h

template < int rows, int columns > class Matrix { /*...*/ };

变换.h

#include "Matrix.h"

typedef Matrix<4,4> Matrix3D; 

class Transform3d { Matrix3D matrix; /*...*/ };
于 2012-04-19T05:53:40.790 回答