C++ объявляет функцию вместо вызова сложного конструктора.

Во-первых, я знаю, что в stackoverflow уже есть подобные вопросы ( this, thisи this ), и поэтому я понимаю причина моей проблемы. К сожалению, это не помогает мне решить эту проблему.

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

Вот некоторые фрагменты моего кода (я переименовал имена классов, потому что они длинные и неуместные):

class algoContainer{
public:
algoContainer(algo1Virtual &alg1 = algo1Concrete::emptyInstance(),
      algo2Virtual &alg2 = algo2Concrete::instance());

someUsefulFunction();
};

class algo1Concrete : public algo1Virtual{
    private:
    algo1Concrete();
    public:
    static algo1Concrete &emptyInstance(); // "empty" instance treated
                                           // specifically
                                           //  -- uses private no arg constructor
    algo1Concrete(const std::vector &myData); // construcotr
};

class algo1Virtual{
    // ... all functions virtual, no implementations ...
};


// ... similar for algo2Virtual/Concrete ...

Все функции в классах Concreteреализованы, в то время как ни одна из них в классах классы Virtual(кроме конструкторов и деструкторов).

Итак, теперь моя проблема в том, что я хочу сделать что-то вроде :

std::vector  workData;
// fill workData
algoContainer myAC(algo1Concrete(workData));
myAC.someUsefulFunction(); // this line gives compile error

Красиво, мило и элегантно, но это не работает (ошибка такая же, как и во всех вопросах, которые я связал ).Я нашел этот форум-туториал, в котором проблема упоминается как самый неприятный анализ, но это решение (заключить аргумент в скобки) не решает проблему (это длинное в этом случае куча сообщений об ошибках, но я могу отредактировать их в вопросе позже, если это поможет - все они связаны с наследованием виртуальной функции).

Я протестировал свой код, если я использую конструктор со всеми параметрами по умолчанию, и даже если я просто создаю первый параметр отдельно:

std::vector  workData;
// fill workData
algo1Concrete myA1(workData);
algoContainer myAC(myA1);

myAC.someUsefulFunction(); // now it works fine

algoContainer myAC2;
myAC2.someUsefulFunction(); // this also works

Я могу использовать код как есть, но буду очень благодарен если бы кто-нибудь мог дать мне более элегантное решение, чем то, которое я использую прямо сейчас.


РЕДАКТИРОВАТЬ : сообщения об ошибках, которые я получаю, когда исправляю самый неприятный синтаксический анализ

Если я использую код со скобками:

algoContainer myAC((algo1Concrete(workData)));

Мои ошибки:

/some_path/main.cpp:47:65: error: no matching function for call to ‘algoContainer::algoContainer(algo1Concrete)’
/some_path/main.cpp:47:65: note: candidates are:
/some_path/algo/algocont.h:45:5: note: algoContainer::algoContainer(algo1Virtual&, algo2Virtual&)
/some_path/algo/algocont.h:45:5: note:   no known conversion for argument 1 from ‘algo1Concrete’ to ‘algo1Virtual&’
/some_path/algo/algocont.h:36:7: note: algoContainer::algoContainer(const algoContainer&)
/some_path/algo/algocont.h:36:7: note:   no known conversion for argument 1 from ‘algo1Concrete’ to ‘const algoContainer&’

Я переименовал пути и вставил пример файла и имена классов (такие же, как выше) для удобства чтения. Просто замечание: строка 45— это определение рассматриваемого конструктора. С другой стороны, строка 36— это строка class algoContainer.

Я также пробовал с этим кодом:

algoContainer myDect((algo1Virtual)(algo1Concrete(workData)));

И тогда ошибки совершенно другие:

/some_path/main.cpp:47:86: error: cannot allocate an object of abstract type ‘algo1Virtual’
/some_path/algo/alg1/algo1virtual.h:31:7: note:   because the following virtual functions are pure within ‘algo1Virtual’:
/some_path/algo/alg1/algo1virtual.h:42:8: note:     virtual algo1Virtual::~algo1Virtual()
/some_path/algo/alg1/algo1virtual.h:39:18: note:    virtual void algo1Virtual::someAlgo1Function(std::vector&)
/some_path/main.cpp:47:87: error: no matching function for call to ‘algoContainer::algoContainer(algo1Virtual)’
/some_path/main.cpp:47:87: note: candidates are:
/some_path/algo/algocont.h:45:5: note: algoContainer::algoContiner(algo1Virtual&, algo2Virtual&)
/some_path/algo/algocont.h:45:5: note:   no known conversion for argument 1 from ‘algo1Virtual’ to ‘algo1Virtual&’
/some_path/algo/algocont.h:36:7: note: algo1Virtual::algo1Virtual(const algo1Virtual&)
/some_path/algo/algocont.h:36:7: note:   no known conversion for argument 1 from ‘algo1Virtual’ to ‘const algo1Virtual&’

Надеюсь, это поможет.

6
задан Community 23 May 2017 в 11:52
поделиться