gpt4 book ai didi

c++ - 可变模板函数重载失败

转载 作者:行者123 更新时间:2023-11-28 05:04:30 25 4
gpt4 key购买 nike

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

因此调用通用函数而不是更专用的函数。

我的问题是为什么过载没有启动?我觉得我在这里遗漏了一些基本的东西,但是在搜索了几个小时的解决方案之后,我仍然无法解决这个问题。

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

最佳答案

在这个重载中...

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。你应该摆脱它。

关于c++ - 可变模板函数重载失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45161382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com