【问题标题】:C++ operator compilation errorC++ 运算符编译错误
【发布时间】:2012-08-13 13:30:27
【问题描述】:

我正在尝试编译一个在 Xcode 中使用 OpenCV C++ 代码的项目。

template<typename _Tp> inline MatND_<_Tp>& MatND_<_Tp>::operator = (const MatND& m)
{
    if( DataType<_Tp>::type == m.type() )
    {
        Mat::operator = (m);
        return *this;
    }
    if( DataType<_Tp>::depth == m.depth() )
    {
        return (*this = m.reshape(DataType<_Tp>::channels));
    }
    CV_DbgAssert(DataType<_Tp>::channels == m.channels());
    m.convertTo(*this, DataType<_Tp>::type);
    return *this;
}

这里它给了我一个编译器错误“调用没有对象参数的非静态成员函数”行“Mat::operator = (m);”

代码没有损坏,我验证了here

另一个有趣的是,如果我选择编译器为 LLVM GCC 4.2,那么代码可以正常工作,但是在使用 Apple LLVM 编译器 3.2 进行编译时出现此错误。我需要使用 Apple LLVM 编译器进行编译,因为使用 GCC 编译会产生其他问题。

这里有什么问题?

【问题讨论】:

    标签: c++ xcode operator-overloading llvm


    【解决方案1】:

    你需要使用

    this->Mat::operator = (m);

    当您在模板化成员函数中时,编译器不知道您的基类是什么。看起来您正在尝试调用静态成员函数,但 Mat::operator=() 不是静态的,因此它会给您该错误。通过使用 this->Mat::operator=(m),编译器现在知道您实际上是在尝试调用非静态成员函数。

    对于较旧的编译器,第一次遇到模板时检查的次数较少。它们在很大程度上只是存储为一个大的标记序列,并且只有在模板被实例化时才进行任何检查。 C++ 标准现在要求模板在实例化之前进行一定程度的检查,这使得某些技巧成为必要。

    【讨论】:

    • 这实际上不是真的。您描述的问题仅适用于非限定名称。使用像Mat::operator = 这样的限定名称是解决此问题的一种方法。使用this-&gt; 是解决此问题的另一种方法。没有必要同时使用。
    • 解决这个问题的正确方法是什么? this->Mat::operator 解决了编译问题。我不应该使用这个解决方案吗?
    • @ameyazing:如果有效,请使用它,但这一定是编译器中的错误。如果MatND_ 继承自Mat,则此处不需要this-&gt;
    • @AndreyT:我认为你是对的。据我所知,在实例化之前,编译器只负责绑定到正确的名称和检查语法。将 Mat::operator= 作为静态成员函数还是非静态成员函数调用是语义问题。
    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多