gpt4 book ai didi

c++ - 尝试使用 OpenCV 卡尔曼滤波器和模板参数时出现编译错误,似乎无法识别 cv::Matt

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:30 24 4
gpt4 key购买 nike

我创建了一个类,其中有一个 OpenCV KalmanFilter(如果有人想知道,则为 OpenCV 2.4)。没有任何模板参数,它编译得很好。

class ClassOkay
{
public:

struct ClassState
{
cv::KalmanFilter kalmanFilter;
double time;
};

void doSomething();

private:

ClassState state;

};

void ClassOkay::doSomething()
{
//Okay
cv::Mat& x = state.kalmanFilter.statePost;
x.at<double>(0) = 5;

//Okay
state.kalmanFilter.statePost.at<double>(0) = 5;
}

现在当我添加一个模板参数时,虽然这里没有具有该模板类型名的对象,但它不再编译。

template<typename SubState>
class ClassNotOkay
{
public:

struct ClassState
{
cv::KalmanFilter kalmanFilter;
double time;
};

void doSomething();

private:

ClassState state;

};

template<typename SubState>
void ClassNotOkay<SubState>::doSomething()
{
//Okay
cv::Mat& x = state.kalmanFilter.statePost;
x.at<double>(0) = 5;

//Not okay
state.kalmanFilter.statePost.at<double>(0) = 5;
}

我尝试访问 statePost 的最后一行,似乎无法将其识别为 cv::Mat。编译报错如下:

../Base.h: In member function ‘void ClassNotOkay<SubState>::doSomething()’:
../Base.h:169:37: error: expected primary-expression before ‘double’
state.kalmanFilter.statePost.at<double>(0) = 5;
^
../Base.h:169:37: error: expected ‘;’ before ‘double’

它不再理解 atstatePost 的方法,这对我来说似乎真的很奇怪。知道这是为什么以及如何发生的吗?

最佳答案

好吧,我不是专家,但我想我明白了现在发生的事情的要点。名称查找在模板类和函数中可能很复杂,因为名称可能依赖于模板。 (即,在第一次解析时,可能无法确定模板函数或类内部引用的名称是类型还是模板名称,或者两者都不是。)

因此,在某些情况下,有必要明确地告诉编译器名称是模板名称还是类型名称。在此示例中,编译器不确定如何解析 at<double> .据推测,这是因为编译器错误地认为它可能依赖于特定的模板参数 ( SubState )。我不确定这是否可以被视为错误 - 可能只是编译器在名称查找方面故意保守。

无论如何,您可以通过显式指示at<double> 来解决编译器错误。是一个模板:

state.kalmanFilter.statePost.template at<double>(0) = 5;

关于c++ - 尝试使用 OpenCV 卡尔曼滤波器和模板参数时出现编译错误,似乎无法识别 cv::Matt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37170746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com