c++ - 由于相互包含 header ,无法在模板化类中成功地成为模板化方法的好友

标签 c++ templates include

我有一个包装矩阵管理逻辑的类。同时我有一套方法专门处理一些重要的耗时矩阵操作操作(如LU分解等)。

该类使用该文件中定义的函数。该文件需要能够访问该类的元素。我需要让那些专门的方法成为上述类(class)的 friend 。这导致我在每个其他 header 中包含一个 header 。

我的问题

我之前描述的情况在这里编码如下。第一段代码引用了mat.hpp

#ifndef MAT_HPP
#define MAT_HPP
#include "operations.hpp"
namespace nsA {
template <typename T>
// Templated class because matrices can be real or complex
class mat {
   // Members...
   friend template <typename U> 
   void exec_lu(const mat<U>& in, const mat<U>& out);
   // Members...
} /* class end */
}
#endif
#endif

第二个文件是operations.hpp

#ifndef OPERATIONS_HPP
#define OPERATIONS_HPP
#include "mat.hpp"
namespace nsA {
namespace nsB {
template <typename T>
void exec_lu(const mat<T>& in, const mat<T>& out);
}
}
#endif

问题是编译器开始报错。

注意事项

请考虑,如果我在 mat.hpp 中注释友元声明但保留包含项,编译器会告诉我在“operations.hpp”中类型 mat 不是定义!

如果在 mat.hpp 中也对包含进行注释,并保持友元声明也被注释,编译器就可以了!

如何解决这个问题?

谢谢

最佳答案

您可以通过添加几个前向声明来做到这一点...但是您甚至可以使用更多代码做得更好:

template <typename T> class mat;
template <typename T> void exec_lu( const mat<T>&, const mat<T>& );
template <typename T>
class mat {
   friend void exec_lu<T>( const mat<T>&, const mat<T>& );
};
template <typename T>
void exec_lu( const mat<T>& a, const mat<T>& b ) { ... }

此方法与您的方法之间的主要区别(除了修复语法限制外)是在这种方法中,exec_lu 的单个实例化。被授予访问 mat<T> 的权限,特别是需要访问它的实例化。在您的代码中(修复后),exec_lu 的所有特化可以访问 mat 的任何特化(即 exec_lu<int> 可以访问 mat<int> 私有(private)成员,但也可以访问 mat<double> ...)而你可能不希望这样。

有关声明模板好友的不同选项的详细说明,请阅读 answer一个相关的问题。

关于c++ - 由于相互包含 header ,无法在模板化类中成功地成为模板化方法的好友,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11255495/

相关文章:

c++ - 为什么这是有效的? (具有不同参数的模板类的模板友元函数)

excel - 如何通过 VBA 使用我的 powerpoint 模板来构建我想要的幻灯片?

php - 相对地址问题,当包含指向许多外部 JS 的 PHP 页面时

ruby-on-rails - 如何从 Rails LEFT OUTER JOIN 访问连接记录

c++ - 将 Objective-C block 传递给 C++ lambda

c++ - 如何为模板的内部类型专门化一个类?

c++ - DirectXTK 在 "Mouse"中没有成员 "SetWindow(HWND hwnd)"

php - 测试文件是否存在于包含路径中的任何位置

在我关闭程序之前,C++ 文件夹不会删除

c++ - OpenGL rubiks cube - 用鼠标进行面部旋转