繁体   English   中英

在这种情况下必须扩展参数包

[英]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>
        &param,
    T value) {
  param.reset(new T(value));
}

template <typename jsParamType, size_t paramIndex, typename... jsParamTypes>
bool testV(std::shared_ptr<typename jsParamType::Type> &param,
           ParamInfo &paramInfo) {
  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>...> &params,
           std::vector<ParamInfo> &paramsInfos,
           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>...> &params,
           std::vector<ParamInfo> &paramsInfos) {
  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM