非再帰的な可変個引数のテンプレート化されたメソッドから呼び出される再帰的な可変個引数のテンプレート化されたメソッドがあります(おそらく関連性はありませんが、念のために言及します)。
template < class T, class UnaryPredicate, typename... UnaryPredicates >
static bool checkPredicate( const T obj,
const UnaryPredicate& p,
UnaryPredicates... predicates )
{
bool output = p( obj );
if ( output && sizeof...( UnaryPredicates ) ) {
output = checkPredicate( obj, predicates... ); // The problem line.
}
return output;
}
ただし、次のコマンドで呼び出された場合:
.. = checkPredicate< Sy_simObject*, VisiblePredicate< Sy_simObject* >( .. );
次のエラーが発生します。
エラー:「Sy_project :: checkPredicate(Sy_simObject * const&)」の呼び出しに一致する関数がありません
UnaryPredicates
エラーが空であることを示していることを理解しています。オーバーロードはありませんT
。これを挿入すれば、正常にコンパイルされます。しかし、条件付きのチェックでそれがどのようにそこまで到達できたのか理解できませんか?sizeof...( UnaryPredicates )
確かに、これ以上存在しなかった場合、それはfalseと評価され、再帰は終了しますか?
オーバーロードを追加するだけで修正できます。なぜ今は機能しないのかを本当に理解したいのです。