必须在此上下文中扩展参数包

时间:2016-12-08 10:07:34

标签: c++ variadic-templates

我有一个使用这些例程的复杂代码:

#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 ++下编译和工作,但我得到&#34; jsParamType:参数包必须在此上下文中扩展&#34;我在函数头的实际代码

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 个答案:

答案 0 :(得分:0)

我会在这里发布我的经验解决方案,虽然我不确定它是否是编译器错误,但我总是把我当成问题的原因。由于产生问题的代码太复杂而无法发布(数十个文件和依赖项),我将解释我的两个修复程序,使其工作:

选项1:testV重命名为testU

选项2:保留testV名称并更改其模板参数,只是与testU模板参数不同,重新排序就足够了。

可能是因某些原因混淆了函数的编译器递归算法?我不知道,因为它不能轻易复制,在某些情况下似乎没有上面的两个解决方案......嗯,我不认为这是一个真正的答案,但解决了我的问题。我对来自我的同事程序员的批评持开放态度,比我更有经验。