gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:55:56 25 4
gpt4 key购买 nike

我有一个包装矩阵管理逻辑的类。同时我有一套方法专门处理一些重要的耗时矩阵操作操作(如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/

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