我有几个头/源文件:FUNCS.h和FUNCS.cpp、MIX.cpp和main.cpp.在函数和我的MIX类中应该有复杂的库,但当我试图将其包含在我的MIX.h中时,例如,我会错误地认为复杂不是模板。我应该在哪里包括库,这样我的所有标题都会将complex定义为模板?示例:
#pragma once
#include <complex>
class MATRIX
{
friend MATRIX sum(MATRIX a, MATRIX b);
friend MATRIX mult(MATRIX a, MATRIX b);
friend MATRIX vi4(MATRIX a, MATRIX b);
friend MATRIX operator * (const MATRIX& a, complex<int> b);
friend MATRIX operator * (complex<int> b, const MATRIX& a);
private:
complex<int>** M;
int m;
int n;
public:
MATRIX();
MATRIX(int _m, int _n);
MATRIX(int _m);
MATRIX(const MATRIX& _M);
complex<int> get(int i, int j);
void set(int i, int j, complex<int> value);
void Print();
MATRIX operator=(const MATRIX& _M);
complex<int>* operator[] (int index);
~MATRIX();
};
在<complex>
中定义的是std::complex
,您尝试使用的是complex
,编译器在全局范围中找不到称为complex
的东西。
更改
friend MATRIX operator * (complex<int> b, const MATRIX& a);
至
friend MATRIX operator * (std::complex<int> b, const MATRIX& a);
或通过介绍名称
using std::complex;
但不要在头球中那样做!相反,只将其放在源文件中。不在报头中这样做的原因是,包括报头的所有其它代码将";inherit";从长远来看,这将导致问题。
应该包含在每个使用std::complex
的文件中的头。
请注意,有时您可以间接地包含它,如:a.h
包括<complex>
,b.h
包括a.h
,因此它可以使用std::complex
而不必解释性地包含<complex>
。不要依赖它!从长远来看,这会造成麻烦。
进一步注意,通常远期申报就足够了。它超出了您在示例中的内容,但为了完整性起见,我提到它。当您只使用指向类型的指针和引用时,就不需要在标头中定义。在这种情况下,声明就足够了,并且头只能包含在源中。这可以减少大型项目的编译时间。
我应该在哪里包括
<complex>
在使用该文件声明的每个文件中,在这些使用之前。按照惯例,头文件包括在文件的开头(头(
complex<int>** M;
我得到一个错误,复杂不是一个模板。
<complex>
没有声明::complex
。它声明std::complex
。请改用std::complex
。