我有一个模板类,它接受一对类型和一个整数常量的元组(某些类型可以重复,所以它不能是一个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()
)时,我有一些非常相似的工作但是只要我使用整数常量生成元组对,我就无法提取第一个元素的类型对,并做同样的事。
由于
答案 0 :(得分:0)
TL; DNR: indexRepository.findAll().stream()
.findFirst()
.orElseThrow(
() -> new IndexNotFoundException("Index cannot be found")
);
会产生一种类型&#34;对...&#34;的引用,它(它的参考)显然没有成员。简单修复:使用std::remove_reference
删除引用:
decltype
这不是关于hana。把它带出循环&#34;我们可以进一步减少您的情况
ret[idx++] =
std::remove_reference_t<decltype(hana::first(c))>::type::toString();
这给出了(基本上)与您相同的错误消息:
错误:&#39; decltype(get_it())&#39; (又名&#39; A&amp;&#39;)不是类,命名空间或枚举
这告诉我们#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();
}
(对A &
的引用)不是类(等),因此不能有(静态)成员。当您的编译器告诉您:
错误:键入&#39; decltype(hana :: first(c))&#39; (又名&#39; boost :: hana :: type_impl :: _&amp;&#39;)不能在&#39; ::&#39;之前使用。因为它没有成员
A
是参考。当然它没有成员。引用的类具有,因此只需使用boost::hana::type_impl::_ &
删除引用。
在documentation,btw(强调我的)中还注明了std::remove_reference
的返回类型是引用类型这一事实:
返回一对的第一个元素。注意如果Product实际存储它包含的元素,则hana :: first 需要返回左值引用,左值引用为const或rvalue引用到第一个元素,其中引用的类型必须匹配传递给第一个的对的类型。如果[..,这里不适用]。