我正在尝试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。
在这种超负荷...
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
永远无法推导出来。你应该摆脱它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句