c++ - 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;
解决方案
推荐阅读
- etl - Apache NiFi 是否适合此用例?
- c# - 检查列表框中的输入用户名以在用户名不唯一时显示错误消息
- excel - VBA代码使用不同列的小计求和
- c# - Visual Studio,调试器,在进入另一个类后越过断点运行
- python - 如何在 Python 3.6 的 if/else 中优化文本输出?
- python - 限制在 pytesseract 中检测到的字符数
- javascript - 使用 .rotate() 时,它会留下 1px Lines
- javascript - 从用逗号分隔的对象中收集数据并将自己作为单独的对象 - Javascript
- javascript - 重构passport.js认证代码
- java - 如何获取当前活动的实时流列表并按描述和位置过滤它们