【问题标题】:complex class's default constructor doesn't work [duplicate]复杂类的默认构造函数不起作用[重复]
【发布时间】:2018-08-30 11:39:49
【问题描述】:

根据http://www.cplusplus.com/reference/complex/complex/complex/complex<double> 类具有complex (double re = 0.0, double im = 0.0); 形式的默认构造。但是,我不知道这是否真的正确。谁能解释下面代码的奇怪行为?

#include <iostream>
#include <complex>
#include <typeinfo>
using namespace std;

int main() {

    complex<double> cmp1(1, 2);
    complex<double> cmp2(1); //isn't the same as cmp2(1, 0.0) ?
    complex<double> cmp3(); //isn't the same as cmp3(0.0, 0.0) ?

    cout << cmp1.real() << "\n"; //=> 1
    cout << cmp1.imag() << "\n"; //=> 2

    cout << cmp2.real() << "\n"; //=> 1
    cout << cmp2.imag() << "\n"; //=> 0

    //cout << cmp3.real() << "\n"; //error (why?) //mark1
    //cout << cmp3.imag() << "\n"; //error (why?)

    /* error message output by `mark1`: */
    /* request for member ‘real’ in ‘cmp3’, which is of */
    /* non-class type ‘std::complex<double>()’ */

    cout << cmp3 << "\n"; //=> 1 (why?)

    cout << typeid(cmp1).name() << "\n"; //=> St7complexIdE
    cout << typeid(cmp2).name() << "\n"; //=> St7complexIdE
    cout << typeid(cmp3).name() << "\n"; //=> FSt7complexIdEvE

}

环境:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

编译选项:

$ g++ -Wall -std=c++98 <file name>

【问题讨论】:

  • 最麻烦的解析? --> Nope.
  • 这是一个函数声明。搜索“令人烦恼的解析”。
  • 恭喜,你现在是MVP
  • complex&lt;double&gt; cmp3(); 声明了一个名为 cmp3 的函数,不带任何参数并返回一个 complex&lt;double&gt;
  • complex&lt;double&gt; cmp3(); 是一个名为 cmp3() 的函数的声明,它不接受任何参数并返回 complex&lt;double&gt;。如果要声明complex&lt;double&gt; 类型的变量,请删除()

标签: c++ most-vexing-parse


【解决方案1】:

改变:

complex<double> cmp3(); //isn't the same as cmp3(0.0, 0.0) ?

complex<double> cmp3; //isn't the same as cmp3(0.0, 0.0) ?

它应该可以正常工作

这是因为编译器可能认为这是一个函数声明

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多