【问题标题】:Where should I include <complex>我应该在哪里包含 <complex>
【发布时间】:2021-02-28 17:15:43
【问题描述】:

我有几个头文件/源文件:FUNCS.h 和 FUNCS.cpp、MATRIX.h 和 MATRIX.cpp,以及 main.cpp .在 funcs 和我的 MATRIX 类中应该有复杂的库,但是当我尝试将它包含在我的 MATRIX.h 中时,我得到的错误是 complex 不是模板。 我应该在哪里包含库,以便我的所有标题都将 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&lt;int&gt; -> std::complex&lt;int&gt;。很可能是错字。
  • 顺便说一下,将_M 定义为令牌的行为是未定义的。使用Matrix 而不是MATRIX 作为类名将不那么特殊。另外,您真的需要将有效负载存储为裸指针吗?
  • std::complex 没有 int 专业化。

标签: c++ function templates header project


【解决方案1】:

&lt;complex&gt; 中定义的是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;

但不要在标题中这样做!而是仅将其放在源文件中。不在标头中执行此操作的原因是包含标头的所有其他代码都会“继承”它,从长远来看会导致问题。


您应该在每个使用std::complex 的文件中包含标题。

请注意,有时您可以间接包含它,例如:a.h 包含 &lt;complex&gt;b.h 包含 a.h,因此它可以使用 std::complex 而无需明确包含 &lt;complex&gt;。不要依赖那个!从长远来看,它会带来麻烦。

进一步注意,前向声明通常就足够了。它超出了您在示例中的内容,但为了完整起见,我提到它。当您使用的只是类型的指针和引用时,您不需要在标头中进行定义。在这种情况下,声明就足够了,并且标头只能包含在源中。这可以减少大型项目的编译时间。

【讨论】:

  • 非常感谢,这是表面上的。你能告诉我如何将静态变量放在头文件中吗?如果我使用 extern static int 我会得到一个错误
  • @СтаниславБуштюк 抱歉,这是一个不同的问题,cmets 不适合回答问题。如果您还有其他问题,那么您可以打开另一个问题。搜索之前已有的问题,可能你已经找到答案了
  • @СтаниславБуштюк 也许是这样的:stackoverflow.com/questions/5040525/…
  • 试图将项目分成文件并得到154个错误,似乎那里有很多要理解的地方。你知道任何有用的读物​​吗?
【解决方案2】:

我应该在哪里添加&lt;complex&gt;

在您使用该文件声明的每个文件中,在这些用法之前。按照惯例,标题包含在文件的开头(头)

complex<int>** M;

我收到复杂不是模板的错误。

&lt;complex&gt; 没有声明::complex。它声明std::complex。请改用std::complex

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多