This question already has an answer here:
Most vexing parse

(1个答案)


3年前关闭。




我在互联网上搜索了此编译错误的解决方案。它们中的大多数似乎与两个选项有关:
  • 将指针视为对象并且不取消引用它。
  • 错误地将变量与函数一起返回变量类型并尝试访问它。

  • 我的代码是:
    #ifndef ESCRITOR_PROLOG_HH
    #define ESCRITOR_PROLOG_HH
    
    #include "planning.hh"
    #include <string>
    #include <ostream>
    
    class EscritorProlog {
    private:
      Planning planningAEscriure;
    public:
      EscritorProlog(Planning planning);
      EscritorProlog(Planning &&planning);
      void escriuFitxerProlog(std::ostream &escritor);
    };
    
    #endif
    

    和main.cc:
    #ifndef MAIN_CC
    #define MAIN_CC
    
    #include "escritorProlog.hh"
    #include <iostream>
    #include <fstream>
    
    int main () {
      std::ofstream escritor("./test.txt");
      EscritorProlog test(Planning());
      test.escriuFitxerProlog(escritor);
    }
    #endif
    

    如果您尝试使用
    g++ -c main.cc -std=c++11
    

    您只会得到错误...
    main.cc: In function ‘int main()’:
    main.cc:11:8: error: request for member ‘escriuFitxerProlog’ in ‘test’, which is of non-class type ‘EscritorProlog(Planning (*)())’
       test.escriuFitxerProlog(escritor);
    

    现在,我不知道是否缺少某些内容,但是看不到代码中前面提到的两个问题。很抱歉,如果我盲目失明或其他任何原因,但是我看不到错误。

    任何帮助,将不胜感激。

    最佳答案

    这是the most vexing parse的实例。

    您可以使用列表初始化来解决它,在这种情况下,它是明确的:

    EscritorProlog test(Planning{});
    

    不幸的是,您从EscritorProlog构造了不明确的Planning:
    EscritorProlog(Planning planning); // (1)
    EscritorProlog(Planning &&planning); // (2)
    

    假设您要为(1)定义一个复制构造函数,请将签名更改为
    EscritorProlog(const Planning& planning);
    

    为了避免歧义。通过这些更改,您的代码将被编译。

    wandbox example

    10-06 13:19