如何将模板类作为函数参数传递而不发生 C7568 错误

问题描述 投票:0回答:3

这里是 C++ 新手。我很确定这个问题有一个简单而明显的解决方案,但即使在阅读了数十个类似的问答之后,我仍然没有更接近它。但这是我的问题:

我有一个模板类:

template<class T>
struct KalmanSmoother
{
   Eigen::MatrixX<T> P;
   ...
   KalmanSmoother(int dynamParams, int measureParams, int controlParams = 0);
   ...
}

我可以毫无问题地使用它,就像这样:

KalmanSmoother<float> smoother(4, 2);
smoother.P = Eigen::Matrix4f {
   {0.1f, 0.0f, 0.1f, 0.0f},
   {0.0f, 0.1f, 0.0f, 0.1f},
   {0.1f, 0.0f, 0.1f, 0.0f},
   {0.0f, 0.1f, 0.0f, 0.1f}
};
...

就像魅力一样。但是,当我想重构代码并将初始化部分提取到其他函数中时,编译器(MSVC 19.31.31104.0)开始哭泣。函数提取如下所示:

// Declaration in the header:
void setupKalmanSmoother(KalmanSmoother<float> & smoother);

// Definition in the .cpp
inline void Vehicle::setupKalmanSmoother(KalmanSmoother<float> & smoother)
{
   smoother.P = Eigen::Matrix4f {
      {0.1f, 0.0f, 0.1f, 0.0f},
      {0.0f, 0.1f, 0.0f, 0.1f},
      {0.1f, 0.0f, 0.1f, 0.0f},
      {0.0f, 0.1f, 0.0f, 0.1f}
   };
   ...
}

我想这样称呼它:

KalmanSmoother<float> smoother(4, 2);
setupKalmanSmoother(smoother);

没什么神奇的。它应该可以工作(我想......),但我收到这个编译器错误:

error C7568: argument list missing after assumed function template 'KalmanSmoother'

错误消息指向标头中的声明。值得一提的是,模板类的所有函数定义都在头文件中,因为当我出于习惯将定义放入 .cpp 文件时,我已经遇到了完全相同的错误。

那么我错过了什么?

提前致谢!

c++ parameter-passing pass-by-reference template-classes
3个回答
2
投票

我遇到了一个非常相似的错误。就我而言,这是由于循环#includes造成的。


0
投票

在创建模板类的数据成员时,我遇到了同样的错误。

    List<Graphics::RenderObject*> m_RenderObjects;

我的实例中的修复是我需要将范围限制在“List<>”所在的命名空间中。

    STD::List<Graphics::RenderObject*> m_RenderObjects;

它没有说“List”未定义,而是给出了错误 7568。这是误导性的。 我建议检查类似的问题。


0
投票

此错误代码也有类似的问题,编译器无法编译以创建堆栈。 解决方案是将包含内容移至“.H”文件中,而不是直接移至 CPP 文件中。 some_class 定义和堆栈变量的创建没有动。 我花了一天时间才弄清楚这一点,所以我希望它对其他人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.