可变参数模板函数重载failes

时间:2017-07-18 08:29:31

标签: c++ qt templates overloading variadic

我正在尝试为某些单元测试实现某种StringBuilder。问题是我在一些模板中大量使用QByteArray,这些模板使用StringBuilder进行日志记录。为了在QByteArray中使用QString().arg(),我通常必须用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...);

因此调用泛型函数而不是更专业的函数。

我的问题是为什么不会超载?我觉得我在这里遗漏了一些基本的东西,但经过几个小时的搜索后,我仍然无法绕过它。

我正在使用Qt 5.9.0和mingw32 5.3.0 32Bit。

1 个答案:

答案 0 :(得分: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。你应该摆脱它。