0

我有一个模板类,它接受一个类型对和一个整数常量的元组(某些类型可以重复,因此它不能是 hana::map)。我正在寻找迭代元组并调用toString()为每种类型定义的静态类型方法。我收到的错误是:

“错误:类型 'decltype(hana::first(c))' (又名 'boost::hana::type_impl::_ &')不能在 '::' 之前使用,因为它没有成员”

struct A
{
    static std::string toString() {return std::string("A");}
};
struct B
{
    static std::string toString() {return std::string("B");}
};

using namespace hana::literals;
std::array<std::string,3> ret;
constexpr auto tupleOfPairs = hana::make_tuple(
    hana::make_pair(hana::type_c<A>, 0_c),
    hana::make_pair(hana::type_c<B>, 0_c),
    hana::make_pair(hana::type_c<B>, 5_c));

size_t idx = 0;
hana::for_each(tupleOfPairs, [&](auto c)
{
    ret[idx++] = decltype(hana::first(c))::type::toString();
});

当它只是一个元组(使用decltype(c)::type::toString())时,我有一些非常相似的工作,但是一旦我将元组元素对与一个整数常数进行配对,我似乎无法提取该对的第一个元素的类型并执行相同的操作。

谢谢

4

1 回答 1

0

TL;DNR:decltype会产生一个类型“对...的引用”,它(它是一个引用)显然没有成员。简单修复:删除引用std::remove_reference

ret[idx++] = 
  std::remove_reference_t<decltype(hana::first(c))>::type::toString();

这不是关于hana。将其“排除在外”,我们可以将您的案例进一步减少到

#include <string>
struct A {
  static std::string toString() {
    return std::string("A");
  }
};
template<typename T> T & get_it() {
  static T thing;
  return thing;
}
int main() {
  std::string str = decltype(get_it<A>())::toString();
}

这(基本上)给出了与您相同的错误消息:

错误:“decltype(get_it())”(又名“A &”)不是类、命名空间或枚举

这告诉我们A &(对 的引用A)不是类(等),因此不能有(静态)成员。当您的编译器告诉您:

错误:类型 'decltype(hana::first(c))' (又名 'boost::hana::type_impl::_ &')不能在 '::' 之前使用,因为它没有成员

boost::hana::type_impl::_ &是一个参考。当然,它没有成员。被引用的类有,所以只需用 . 删除引用即可std::remove_reference

的返回类型是引用类型的事实first也记录在文档中,顺便说一句(强调我的):

返回一对的第一个元素。注意,如果 Product 实际存储了它包含的元素,hana::first需要返回一个左值引用、一个对 const 的左值引用或一个对第一个元素的右值引用,其中的类型reference 必须与传递给 first 的那对匹配。如果 [..,此处不适用]。

于 2017-06-05T21:54:07.417 回答