私の関数は、与えられた入力引数(variadic)のセットを持つPython関数を呼び出し、関数の出力を含むタプルを返します。C++バリデーションテンプレート戻り型
私はMinGW-w64コンパイラのg ++ポート(C++ 11)を使用してWindows 10マシンでコンパイルしています。次のように私は(とそれを呼び出す)このテンプレート可変引数の関数を宣言した:
// Declaration (in PyInterface.h)
template <typename... Inputs, typename... Outputs>
const std::tuple<Outputs...>& callFunction(const std::string &modulePath, const std::string &funcName, Inputs&&... args) {
// Calls a Python function & packs output variables into a std::tuple...
}
// Sample call (in main.cpp)
const std::tuple<std::string, std::string> output = pi.callFunction(myModulePath, myFuncName, inputArg1, inputArg2, inputArg3);
しかし、このエラーがスローされます(読みやすくするための...
に短縮):
conversion from 'const std::tuple<>' to non-scalar type 'const std::tuple<std::__cxx11::basic_string<...>, std::__cxx11::basic_string<...> >' requested
を私の知る限りとして私はusing two variadic templates is legalを認識しています。さらに、戻り値の型は変数(const std::tuple<std::string, std::string> output
)によって明示的に設定されているようですが、関数の結果を代入しようとしているので、コンパイラは 型の戻り値を知っている必要があります。
元々、私はエラーが単に私がvariadicテンプレートを適切に使用していないことを示していたと思いました。戻り値の型(const T<Outputs...>& callFunction
)を指定するために、ネストされたテンプレートパラメータ(here)を使用してみました。ただし、テンプレートの控除がT
で失敗したことを示すエラーメッセージが表示されただけです。
このエラーは、私の直感が間違っていて、元の関数では、コンパイラがoutput
の型から目的の戻り値の型を推測していないことを示します。
なぜ私の直感は間違っていますか?どのように私は正しくvariadicテンプレートを使用してこの関数の戻り値の型を指定しますか?
'Outputs'の型を指定することはありません。 – NathanOliver
@ NathanOliver 'Outputs'の型をどのように指定すればよいか教えてください。 'pi.callFunction'の呼び出しを修正しようとしましたが、エラーメッセージの意味を理解できませんでした: 'error:can not bind 'const string {別名const std :: __ cxx11 :: basic_string }' lvalue to 'std :: __ cxx11 :: basic_string &&' ' –
Input型として明示的に 'string'を指定しています。右辺値参照は関数引数宣言 'Inputs &&'と組み合わされて得られます。 'const string'の左辺値を渡しています。これは、使用する前に少なくとも' const'を削除する必要があります。 Input型が暗黙的に拾われたところの答えのほかに、 'Inputs &&'と組み合わされたときに' const string& 'のままであるInput型として' const string& 'を明示的に指定できます。 –