1

我正在尝试编译一个在 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);”行上给了我一个编译器错误“调用没有对象参数的非静态成员函数”

代码没有损坏,我在这里验证了它。

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

这里有什么问题?

4

1 回答 1

2

你需要使用

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

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

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

于 2012-08-17T05:04:58.473 回答