2017-07-18 3 views
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ビットを使用しています。この過負荷で

答えて

1

...

template<typename Head, typename ...Tail> 
const char* buildCString(const QString& msg, const QByteArray& arg, const Tail&... rest){ 
    return buildCString(msg.arg(QString(arg)), rest...); 
} 

...テンプレートパラメータHeadを推定することはできません。あなたはそれを取り除くべきです。

+0

これは、ありがとう! Btw、私はここでそれを見たことがあります:https://stackoverflow.com/questions/40687615/variadic-template-function-overloadingなぜそれが有効ですか? – RyanMcFlames

+0

@RyanMcFlames彼はコールサイト(foo (args ...))でテンプレート引数を提供しているからです。あなたはbuildCString (...)でもそれを実行できました。 –

関連する問題