矩阵类:错误:“)”标记之前的预期主表达式
Posted
技术标签:
【中文标题】矩阵类:错误:“)”标记之前的预期主表达式【英文标题】:Matrix Class: error: expected primary-expression before ')' token 【发布时间】:2015-10-17 17:28:54 【问题描述】:我有一个从 Matrix 基类(模板类)派生/扩展的 Matrix4 类。模板类的方法在同一个头文件中声明和定义。
我只复制了“Matrix4”类中出现错误的部分。第 10 行和第 13 行出现同样的错误。我看不到任何缺失的变量或参数。我试过去掉括号,但没有用。
我已经搜索了关于我可能做错了什么的线索,但我没有在本网站上的类似问题中找到任何有用的信息...我非常感谢您的帮助。
给出错误的 Matrix4 类:
template<typename T>
class Matrix4 : public Matrix<T, 4>
public:
Matrix4()
inline Matrix4 InitOrthographic(T left, T right, T bottom, T top, T near, T far)
const T width = (right - left);
const T height = (top - bottom);
const T depth = (far - near); //error occurs here
(*this)[0][0] = T(2)/width; (*this)[1][0] = T(0); (*this)[2][0] = T(0); (*this)[3][0] = -(right + left)/width;
(*this)[0][1] = T(0); (*this)[1][1] = T(2)/height; (*this)[2][1] = T(0); (*this)[3][1] = -(top + bottom)/height;
(*this)[0][2] = T(0); (*this)[1][2] = T(0); (*this)[2][2] = T(-2)/depth; (*this)[3][2] = -(far + near)/depth; //and here
(*this)[0][3] = T(0); (*this)[1][3] = T(0); (*this)[2][3] = T(0); (*this)[3][3] = T(1);
return *this;
基本矩阵类:
template<typename T, unsigned int D>
class Matrix
public:
Matrix()
virtual ~Matrix()
Matrix(const Matrix& other) *this = other;
inline Matrix InitIdentity(); //defined in the same header, but left out here to save space
inline Matrix InitTranslation(const Vector<T, D-1>& r);
inline Matrix& operator=(const Matrix& rhs);
inline Matrix operator*(const Matrix<T,D>& r) const;
inline const T* operator[](int index) const return m[index];
inline T* operator[](int index) return m[index];
private:
T m[D][D];
;
在基“Matrix”类中没有错误,只有在派生的“Matrix4”类中。
如果代码看起来很熟悉,那是因为我关注的是Youtube tutorial。
【问题讨论】:
上面的代码中没有行号。所以 10 和 13 没有意义。哪一行导致错误?我没有任何错误... 这段代码充满了错误,例如在类方法中返回Matrix
。
我添加了 cmets 来指示错误发生的位置。例如const T depth = (far - near); 线和 (*this)[0][3] = T(0); (*这个)[1][3] = T(0); (*这个)[2][3] = T(0); (*这个)[3][3] = T(1); //这里
这是在哪个编译器上?
MinGW 4.8.1 使用 Code::Blocks IDE
【参考方案1】:
找到了解决方案!谢谢您的帮助!
我将参数变量名称从“far”和“near”更改为“m_near”和“m_far”,现在它可以工作了。我认为这可能与代码中某处的类中的#define 或其他方法发生冲突。
它编译并运行没有错误。我找不到导致冲突/错误的原始问题的原因。更改似乎已经解决了问题,所以我认为不需要看起来太长或太难。
const,在方法中的变量声明之前,似乎还没有产生任何不良影响,所以我会保留它。
Matrix4 类的固定代码:
inline Matrix4<T> InitOrthographic(T left, T right, T m_near, T m_far, T bottom, T top)
const T width = right - left;
const T height = top - bottom;
const T depth = m_far - m_near;
(*this)[0][0] = T(2)/width; (*this)[1][0] = T(0); (*this)[2][0] = T(0); (*this)[3][0] = -(right + left)/width;
(*this)[0][1] = T(0); (*this)[1][1] = T(2)/height; (*this)[2][1] = T(0); (*this)[3][1] = -(top + bottom)/height;
(*this)[0][2] = T(0); (*this)[1][2] = T(0); (*this)[2][2] = T(-2)/depth; (*this)[3][2] = -(m_far + m_near)/depth;
(*this)[0][3] = T(0); (*this)[1][3] = T(0); (*this)[2][3] = T(0); (*this)[3][3] = T(1);
return *this;
【讨论】:
"far" 和 "near" 通常用于修饰一些奇数计算机(MSVC 曾经定位的)的指针类型,因此可能是它们被解析的地方。严格的 C++ 说它们不是关键字,所以无论如何你的代码都应该被接受为有效的。 我想我可能在代码的其他地方有一个变量或#define,但我找不到任何东西。 @Mykola 说他在 MS Visual C++ 上编译成功,所以我认为可能是编译器或者只是 IDE 如何将项目输入到命令行中 向后兼容ftw。【参考方案2】:试试这个,在MS Visual C++下编译成功
template<typename T, unsigned int D>
class Matrix
public:
Matrix()
virtual ~Matrix()
Matrix(const Matrix<T, D>& other) *this = other;
inline Matrix<T, D> InitIdentity(); //defined in the same header, but left out here to save space
inline Matrix<T, D> InitTranslation(const Vector<T, D-1>& r);
inline Matrix<T, D>& operator=(const Matrix<T, D>& rhs);
inline Matrix<T, D> operator*(const Matrix<T,D>& r) const;
inline const T* operator[](int index) const return m[index];
inline T* operator[](int index) return m[index];
private:
T m[D][D];
;
template<typename T>
class Matrix4 : public Matrix<T, 4>
public:
Matrix4()
inline Matrix4<T> InitOrthographic(T left, T right, T bottom, T top, T near, T far)
const T width = (right - left);
const T height = (top - bottom);
const T depth = (far - near); //error occurs here
(*this)[0][0] = T(2)/width; (*this)[1][0] = T(0); (*this)[2][0] = T(0); (*this)[3][0] = -(right + left)/width;
(*this)[0][1] = T(0); (*this)[1][1] = T(2)/height; (*this)[2][1] = T(0); (*this)[3][1] = -(top + bottom)/height;
(*this)[0][2] = T(0); (*this)[1][2] = T(0); (*this)[2][2] = T(-2)/depth; (*this)[3][2] = -(far + near)/depth;
(*this)[0][3] = T(0); (*this)[1][3] = T(0); (*this)[2][3] = T(0); (*this)[3][3] = T(1); //and here
return *this;
;
我不知道 Vector
类发生了什么,因为我用 int 替换了它
【讨论】:
不完全是,您返回错误的类型,请仔细查看 ansver。 在模板类中你必须返回一个模板对象 我复制并粘贴了您的代码,但我仍然在相同的地方收到相同的错误...这可能是编译器之间的差异吗?一开始我有返回 Matrix4(far - near);
中删除()
请描述您在 OP 代码中所做的更改。以上是关于矩阵类:错误:“)”标记之前的预期主表达式的主要内容,如果未能解决你的问题,请参考以下文章