0
いくつかのユニットテストでは、何らかの種類のStringBuilder
を実装しようとしています。問題は、ログのためにStringBuilder
を使用している一部のテンプレート内で大きくQByteArray
を使用していることです。 QString().arg()
でQByteArray
を使用するには、通常、バイト配列をQString(...)
でラップする必要があります。可変テンプレート関数のオーバーロードが失敗する
const char* buildCString(const QString& msg){
return msg.toLatin1().toStdString().data();
}
template<typename Head, typename ...Tail>
const char* buildCString(const QString& msg, const Head& arg, const Tail&... rest){
return buildCString(msg.arg(arg), rest...); //generic use case
}
template<typename Head, typename ...Tail>
const char* buildCString(const QString& msg, const QByteArray& arg, const Tail&... rest){
return buildCString(msg.arg(QString(arg)), rest...);
}
void main(){
auto data = buildCString("double %1, QByteArray %2, int %3", 0.123, QByteArray("Test"), 2);
cout << "Data: " << data << endl;
}
そして、次のエラーが表示されます:
In instantiation of 'const char* buildCString(QString, Head, Tail ...) [with Head = QByteArray; Tail = {int}]':
required from 'const char* buildCString(QString, Head, Tail ...) [with Head = double; Tail = {QByteArray, int}]'
required from here
Fehler: call of overloaded 'arg(QByteArray&)' is ambiguous
return buildCString(msg.arg(arg), rest...);
Soは、一般的な機能ではなく、より専門的な一つで呼び出さ
は、だから私は、次のことを試してみました。私の質問は、なぜ過負荷キックインですか?私はここで何か基本的なものが欠けていると感じていますが、解決のためのサーバ時間を探しても、私はまだそれの周りに私の頭を包むことはできません。
私はQt 5.9.0とmingw32 5.3.0 32ビットを使用しています。この過負荷で
これは、ありがとう! Btw、私はここでそれを見たことがあります:https://stackoverflow.com/questions/40687615/variadic-template-function-overloadingなぜそれが有効ですか? – RyanMcFlames
@RyanMcFlames彼はコールサイト(foo (args ...))でテンプレート引数を提供しているからです。あなたはbuildCString(...)でもそれを実行できました。 –