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