矩阵类:错误:“)”标记之前的预期主表达式

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 代码中所做的更改。

以上是关于矩阵类:错误:“)”标记之前的预期主表达式的主要内容,如果未能解决你的问题,请参考以下文章

strcmp - '[' 标记之前的预期主表达式

c++ if (DEBUG) ... '==' 标记之前的预期主表达式

cpp:“。”标记之前的预期主表达式

无法弄清楚出了啥问题:“')'标记之前的预期主表达式”

错误:“双重”修复之前的预期主表达式?

在另一个成员函数中调用成员函数时,在“int”之前的预期主表达式