まず、stackoverflow ( this、this、およびthis one ) に既に同様の質問があることを知っているため、問題の理由を理解しています。残念ながら、それは私がそれを解決するのに役立ちません。
上記の質問はすべてデフォルトのパラメーターなしのコンストラクターに関するものですが、デフォルト値を持つ 2 つのパラメーター コンストラクターを使用しているときに問題が発生しました。オブジェクトの代わりに関数宣言。
これが私のコードの一部です(クラス名は長くて関連性がないため、名前を変更しました):
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<data> &myData); // construcotr
};
class algo1Virtual{
// ... all functions virtual, no implementations ...
};
// ... similar for algo2Virtual/Concrete ...
クラス内のすべての関数は実装されていますが、Concrete
クラス内の関数はどれも実装されていませんVirtual
(コンストラクタとデストラクタを除く)。
だから、今私の問題は、次のようなことをしたいということです:
std::vector <data> workData;
// fill workData
algoContainer myAC(algo1Concrete(workData));
myAC.someUsefulFunction(); // this line gives compile error
素敵でキュートでエレガントですが、機能しません (リンクしたすべての質問と同じエラー)。問題を最も厄介な parseと呼んでいるこのフォーラムチュートリアルを見つけましたが、それは解決策です (引数を括弧で囲みます) は問題を解決しません (その場合、エラーメッセージの長い束ですが、編集できますそれが役立つ場合は後で質問します-それらはすべて仮想関数の継承に関連しています)。
デフォルトのすべてのパラメーターでコンストラクターを使用する場合、および最初のパラメーターを個別に構築する場合でも、コードをテストしました。
std::vector <data> 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&’
読みやすくするために、パスの名前を変更し、サンプル ファイルとクラス名 (上記と同じ) を挿入しました。備考:line 45
は、問題のコンストラクターの定義です。一方、line 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<data>&)
/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&’
お役に立てれば。