、Googleのテストでは、テンプレートメソッドPrintTo
を宣言します。カスタムタイプのオーバーロードも追加しました。これは、多くのQtの種類の問題を解決するだろうオーバーライド私の独自の実装をライブラリからメソッドをテンプレート
template<typename T>
void PrintTo(const T &val, ::std::ostream *os)
{
QString str;
QDebug(&str) << val;
*os << qUtf8Printable(str);
}
:
私の問題は、私はGoogleが提供するデフォルトのテンプレート化方法を好まないし、代わりに私はこのようにそれを実装したいということです。私はGoogleのテストコード内の実装を変更することはできません。私は自分のコードでそれを再実装する必要があります。私のテンプレートメソッドを使用して
私はこのコンパイラエラーを取得:
include/gtest/gtest-printers.h:707:22: error: call of overloaded ‘PrintTo(const QChar&, std::ostream*&)’ is ambiguous
PrintTo(value, os);
^
include/gtest/gtest-printers.h:707:22: note: candidates are:
include/gtest/gtest-printers.h:454:6: note: void testing::internal::PrintTo(const T&, std::ostream*) [with T = QChar; std::ostream = std::basic_ostream<char>]
void PrintTo(const T& value, ::std::ostream* os) {
^
In file included from tstgoogletest.cpp:51:0:
googletestqttypes.h:24:6: note: void PrintTo(const T&, std::ostream*) [with T = QChar; std::ostream = std::basic_ostream<char>]
void PrintTo(const T &val, ::std::ostream *os)
^
は、それは私が使用したいすべての種類をリストアップすることなく、私のカスタム実装をテンプレートメソッドを「オーバーロード」することは可能ですか?
QDebugは既に何千ものタイプをサポートしていますが、その機能を逃したくありません!
どちらのテンプレート関数も同じシグネチャとテンプレート引数を持ちます。したがって、コンパイラはそれらを区別できません。 'template void PrintTo(const C&val、:: std :: ostream * os){...}'のような関数を宣言するとどうなりますか? –
vahancho
私は引数名を変更すると何か変わるとは思わない!コンパイラのエラー出力も同じように見えます。 –
'void PrintTo(const QAVariant&value、:: std :: ostream * os);'暗黙の変換によって探している型の一部を取得する可能性があります。そうしないと、型ごとに別々の関数を記述する必要があります。 –