首页 > 解决方案 > C++:模板参数列表中参数的类型/值不匹配

问题描述

此单元测试正在编译并通过:

TEST_F(my_tests, state6d_set_get)
{
  double v1=5;
  int index = 2;
  constexpr int nb_items = 10;
  package::States<nb_items,package::State6d> states;
  states.values[index].set<0>(v1);
  double v2 = states.values[index].get<0>();
  ASSERT_EQ(v1,v2);
}

在代码中,我有:

template <int QUEUE_SIZE, int NB_ITEMS>
void MirrorFreeJoints<QUEUE_SIZE, NB_ITEMS>::apply(const mjModel* m, mjData* d)
{
  double v1=5;
  int index = 2;
  constexpr int nb_items = 10;                                                                                                                                                                           
  //constexpr int nb_items = NB_ITEMS; // compilation fails !
  package::States<nb_items,package::State6d> states;
  states.values[index].set<0>(v1);
}

它与单元测试中的代码相同。

此代码编译,但如果

constexpr int nb_items = 10;

被评论和

 constexpr int nb_items = NB_ITEMS;

未注释,编译失败:

错误:'template<class _Key, class _Compare, class _Alloc> class std::set' 的模板参数列表中参数 1 的类型/值不匹配 52 | states.values[index].set<0>(v1); | ^ 注意:期望一个类型,得到 '0' 错误:模板参数 2 无效错误:模板参数 3 无效

QUEUE_SIZE 定义为:

#define QUEUE_SIZE 500000

设置 NB_ITEMS 的值:

// 20 is the value for NB_ITEMS
// add_items_control then instantiate MirrorFreeJoints<>
// (also called with other values than 20)
add_items_control<20>(config, mic);

package::States 和 package::State6d 的代码相当复杂。我试图创建一个可以复制该问题的最小示例,但未能成功,因为这样代码将顺利编译。

有人会直觉可能出了什么问题,相同的代码在单元测试中有效,但在源代码的其余部分无效?

注意:C++17

编辑:

设置函数的代码:

template <typename... Args>
class StateXd
{
public:
    
    // here constructors and other functions

    /*! returns the INDEXth attributes */
    template <int INDEX>
    typename std::tuple_element<INDEX, std::tuple<Args...> >::type get() const;

    /*! set the INDEXth attribute */
    template <int INDEX>
    void set(
        typename std::tuple_element<INDEX, std::tuple<Args...> >::type value);

};

和:

template <typename... Args>
template <int INDEX>
typename std::tuple_element<INDEX, std::tuple<Args...>>::type
StateXd<Args...>::get() const
{
    return std::get<INDEX>(values_);
}

template <typename... Args>
template <int INDEX>
void StateXd<Args...>::set(
    typename std::tuple_element<INDEX, std::tuple<Args...>>::type value)
{
    std::get<INDEX>(values_) = value;
}

state6d 是:

typedef StateXd<double, double, double,
              double, double, double> State6d;

标签: c++templates

解决方案


推荐阅读