2017-07-18 131 views
0

我试图为某些单元测试实现某种StringBuilder。问题是我在一些模板中大量使用QByteArray,它使用StringBuilder进行记录。为了在QString().arg()中使用QByteArray,我通常必须用QString(...)来包装字节数组。variadic模板函数重载失败

所以我试过如下:

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

在这种超负荷...

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

就是这样,谢谢!顺便说一句,我在这里看到类似的东西:https://stackoverflow.com/questions/40687615/variadic-template-function-overloading为什么它在那里有效? – RyanMcFlames

+0

@RyanMcFlames因为他在呼叫站点提供模板参数(foo (args ...))。你可以用buildCString (...)完成它。 –