2017-02-01 9 views
0

Я искал в Интернете решения для этой компиляционной ошибки. Большинство из них, по-видимому, связаны с двумя вариантами:Запрос участника [...] в [...], который относится к классу non-class [...]

  • Обработка указателя как объекта, а не разыменование его.
  • Ошибка в переменной с функцией, возвращающей тип переменной и пытающейся получить к ней доступ.

Мой код:

#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); 

Теперь я не знаю, не хватает ли я чего-то, но я не вижу ни одного из двух вопросов, упомянутых ранее в моем коде. Извините, если я вопию слепо или что-то еще, но я просто не вижу ошибки.

Любая помощь будет оценена по достоинству.

+0

Вы объявили функцию, принимающую один параметр указатель на функцию типа моего друга. Почему, по-вашему, вы можете применить оператор точки к функции? – AnArrayOfFunctions

+0

@AnArrayOfFunctions Я думал, что просто объявляю объект LOL. C++ странно. – lkese3ker

ответ

0

Это пример the most vexing parse.

Вы можете это исправить с помощью списка инициализации, который однозначен в этом контексте:

EscritorProlog test(Planning{}); 

К сожалению, у вас есть неоднозначное EscritorProlog строительства из Planning:

EscritorProlog(Planning planning); // (1) 
EscritorProlog(Planning &&planning); // (2) 

Если предположить, что вы хотели для определения копировального аппарата за (1), изменить подпись на

EscritorProlog(const Planning& planning); 

во избежание двусмысленности. С этими изменениями ваш код будет скомпилирован.

wandbox example

+0

Хорошо, спасибо! – lkese3ker