![](/img/trans.png)
[英]parameter pack must be expanded in this context after switching to Visual Studio 2019
[英]Parameter pack must be expanded in this context
我有一个使用如下例程的复杂代码:
#include <memory>
#include <iostream>
#include <vector>
template <typename T> class C {
public:
typedef T Type;
};
class ParamInfo {
public:
bool value;
};
template <typename T>
void testR(
std::shared_ptr<typename std::enable_if<
std::is_same<int, T>::value || std::is_same<double, T>::value, T>::type>
¶m,
T value) {
param.reset(new T(value));
}
template <typename jsParamType, size_t paramIndex, typename... jsParamTypes>
bool testV(std::shared_ptr<typename jsParamType::Type> ¶m,
ParamInfo ¶mInfo) {
std::cout << param << "\n";
(*param)++;
testR<typename jsParamType::Type>(param, 10);
std::cout << typeid(param).name() << " ++ --> " << *param << std::endl;
paramInfo.value = true;
return true;
}
template <typename... jsParamType, size_t... paramIndex>
bool testU(std::tuple<std::shared_ptr<typename jsParamType::Type>...> ¶ms,
std::vector<ParamInfo> ¶msInfos,
std::index_sequence<paramIndex...>) {
bool r[] = {true,
testV<jsParamType, paramIndex, jsParamType...>(
std::get<paramIndex>(params), paramsInfos[paramIndex])...};
bool res = true;
for (size_t i = 0; i < sizeof...(jsParamType) + 1 && res == true; i++)
res &= r[i];
return res;
}
template <typename... jsParamType>
bool testU(std::tuple<std::shared_ptr<typename jsParamType::Type>...> ¶ms,
std::vector<ParamInfo> ¶msInfos) {
return testU<jsParamType...>(
params, paramsInfos, std::make_index_sequence<sizeof...(jsParamType)>{});
}
template <typename... jsParamType> void test() {
std::tuple<std::shared_ptr<typename jsParamType::Type>...> params =
std::make_tuple(std::shared_ptr<typename jsParamType::Type>(
new typename jsParamType::Type())...);
std::vector<ParamInfo> paramsInfos(sizeof...(jsParamType));
bool ret = testU<jsParamType...>(params, paramsInfos);
std::cout << ret << "\n";
}
int main() {
// your code goes here
test<C<int>, C<double>>();
test<>();
return 0;
}
尽管此代码可以在MSVC / GNUC ++下编译并工作,但是我得到的“ jsParamType:必须在此上下文中扩展参数包”,而我的真实代码在函数头处
template<typename jsParamType, size_t paramIndex, typename... jsParamTypes> bool testV(std::shared_ptr<typename jsParamType::Type>& param, ParamInfo& paramInfo)
对于此参数std::shared_ptr<typename jsParamType::Type>& param
我试图知道是什么原因。 在某些情况下是否需要std::forward
?
我知道这并不多,但是实际代码发布起来却很复杂。
在我的测试中,在没有std::shared_ptr
的真实代码上,我没有收到错误,因此它必须与某些模板评估或参数推导有关。
我将在此处发布经验性的解决方案,尽管我不确定这是否是编译器错误,但我始终认为我是导致此问题的原因。 由于产生问题的代码太复杂而无法在此处发布(数十个文件和依赖项),我将解释使之起作用的两个修复程序:
选项1:将testV
重命名为testU
选项2:保留testV
名称并更改其模板参数,使其与testU
模板参数不同,重新排序就足够了。
编译器递归算法是否可能由于某种原因而使函数混乱? 我不知道,因为它不容易复制,并且在某些情况下,如果没有上述两个解决方案,它似乎就可以工作了……嗯,我认为这不是一个真正的答案,但是可以解决我的问题。 我对这里的程序员的批评持开放态度,比我更有经验。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.