Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++模板函数调用似乎更不专业化 我试图通过使用C++模板来稍微减少样板代码,来简化一些早期的JSON序列化。一切都很顺利,直到我想序列化列表之类的类型,因为这些类型本身也是模板,似乎需要部分模板专门化,而模板函数似乎不存在这种专门化_C++_Templates_Overloading_Template Specialization_Template Argument Deduction - Fatal编程技术网

C++模板函数调用似乎更不专业化 我试图通过使用C++模板来稍微减少样板代码,来简化一些早期的JSON序列化。一切都很顺利,直到我想序列化列表之类的类型,因为这些类型本身也是模板,似乎需要部分模板专门化,而模板函数似乎不存在这种专门化

C++模板函数调用似乎更不专业化 我试图通过使用C++模板来稍微减少样板代码,来简化一些早期的JSON序列化。一切都很顺利,直到我想序列化列表之类的类型,因为这些类型本身也是模板,似乎需要部分模板专门化,而模板函数似乎不存在这种专门化,c++,templates,overloading,template-specialization,template-argument-deduction,C++,Templates,Overloading,Template Specialization,Template Argument Deduction,因此,我运用了我在这里发现的一个巧妙的小技巧: 命名空间支持{ //这些文件位于头文件中 样板 结构转换类型{}; //通过迭代列表成员来序列化列表的专用模板 样板 QJsonValue到jsonvalueconst的QList和source,convertType{ QJsonArray结果; 对于自动it=source.cbegin;it!=source.cend;it++{ 结果。推回*它; } 返回结果; } //生成断言的回退模板 样板 QJsonValue到jsonvaluecon

因此,我运用了我在这里发现的一个巧妙的小技巧:

命名空间支持{ //这些文件位于头文件中 样板 结构转换类型{}; //通过迭代列表成员来序列化列表的专用模板 样板 QJsonValue到jsonvalueconst的QList和source,convertType{ QJsonArray结果; 对于自动it=source.cbegin;it!=source.cend;it++{ 结果。推回*它; } 返回结果; } //生成断言的回退模板 样板 QJsonValue到jsonvalueconst T&source,convertType{ //永远不要调用此函数。 std::string msg=toJsonValue,使用未实现的类型调用; msg+=typeid T.name; Q_ASSERT_Xfalse、toJsonValue、msg.c_str;//始终断言。 返回QJsonValue; } //便利功能 样板 QJsonValue到jsonvalueconst T&source{ 返回JSONValueSource,convertType{}; } //这个在CPP文件中 //整数 样板 QJsonValue到jsonvalueconst int&source,convertType{ 返回QJsonValuesource; } }//NS支持 当我用一个整数调用此模板时,如下所示:


qDebug这两者是否相等?似乎您创建了一个重载,而不是一个局部专门化

// Integer
template <>
QJsonValue toJsonValue(const int &source, convertType<int>) {
    return QJsonValue(source);
}
我不知道为什么会发生这种情况,因为我希望它会采用QList专用的函数模板

有人知道为什么会这样吗

当你打电话的时候

Support::toJsonValue<QList<int>>(foo);
变成

toJsonValue<QList<int>>(source, convertType<QList<int>>{});
// ........^^^^^^^^^^^^
// ........^^^^^^^^^^^^  here is the problem
如果模板参数T是int,则为QList的模板参数

您的呼叫只能与后备专业化匹配

template <typename T>
QJsonValue toJsonValue(const QList<T> &source, convertType<QList<T>>)
template <typename T>
QJsonValue toJsonValue(const T &source, convertType<T>)
建议:让我们来做模板推导。我的意思是:不要在内部调用中显式显示模板参数

toJsonValue<T>(source, convertType<T>{})
template<typename T>
QJsonValue toJsonValue(const T &source) {
    return toJsonValue(source, convertType<T>{}); 
} // ......^^^^^^^^^^^
  // ......^^^^^^^^^^^ no more "<T>" after toJsonValue

因此,两个参数toJsonValue函数都匹配Qlist版本和T,T被推断为int,回退版本和T被推断为Qlist,但Qlist版本应该选择更专业的。据我所知,这不是一个模板类,所以向QJsonValue添加模板参数应该不起作用,对吗?对不起,我说的是QJsonValue to jsonvalueconst int&source,convertType。但我认为这是在您的便利函数中,T将被固定为QList而不是int,因此它不能匹配专用函数。尝试JSONValueSource,convertType{}。啊,这很有意义!在我的问题中的QList overloop中的for循环中,我错误地使用了result.push_back*it;,但这也应该是结果;而不是结果;似乎是这样。非常感谢你详细的回答,我为这个问题费了好几个小时的心思,但这对我来说毫无意义。
template <typename T>
QJsonValue toJsonValue(const T &source, convertType<T>)
template<typename T>
QJsonValue toJsonValue(const T &source) {
    return toJsonValue(source, convertType<T>{}); 
} // ......^^^^^^^^^^^
  // ......^^^^^^^^^^^ no more "<T>" after toJsonValue