【发布时间】:2021-02-01 18:00:29
【问题描述】:
我在初始化提升直方图轴时遇到了一些麻烦。以下似乎导致数组类型和迭代器与指向第一个元素的指针之间不匹配。见解/建议将不胜感激。谢谢。
#include <iostream>
#include <array>
#include <boost/histogram/axis.hpp>
template<class C, const C& array_>
class Foo {
protected:
typedef boost::histogram::axis::variable<> VaxisType;
inline static VaxisType axis_{array_};
std::array<unsigned char, array_.size()> bins_;
public:
Foo() { }
};
template<class C, const C& array_>
class Bar : public Foo<C, array_> {
public:
using Base_Type = Foo<C, array_>;
Bar() : Base_Type{} { }
auto idx(double x) { return Base_Type::axis_.index(x); }
};
template<class Base = float>
class FS {
private:
static const unsigned nbins = 3;
typedef std::array<double, nbins> AType;
static constexpr AType bdrs{2.0, 3.0, 4.0};
Bar<AType, bdrs> blah;
public:
FS() : blah{} { }
auto idx(double x) { return blah.idx(x); }
};
int
main()
{
FS x1;
std::cout << x1.idx(3.5) << "\n";
return 0;
}
生成的错误信息比较长(因为尝试了模板匹配),但其实质如下:
% g++ -std=c++17 -o boost_no_workie-2{,.cc}
In file included from /usr/include/boost/histogram/axis.hpp:13,
from boost_no_workie-2.cc:4:
/usr/include/boost/histogram/axis/variable.hpp: In instantiation of ‘boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::variable(It, It, boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::metadata_type, boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::allocator_type) [with It = const std::array<double, 3>*; <template-parameter-2-2> = boost::histogram::detail::requires_iterator<const std::array<double, 3>*, void>; Value = double; MetaData = boost::use_default; Options = boost::use_default; Allocator = std::allocator<double>; boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::metadata_type = std::__cxx11::basic_string<char>; boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::allocator_type = std::allocator<double>]’:
/usr/include/boost/histogram/axis/variable.hpp:122:77: required from ‘boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::variable(std::initializer_list<_Up>, boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::metadata_type, boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::allocator_type) [with U = std::array<double, 3>; Value = double; MetaData = boost::use_default; Options = boost::use_default; Allocator = std::allocator<double>; boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::metadata_type = std::__cxx11::basic_string<char>; boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::allocator_type = std::allocator<double>]’
boost_no_workie-2.cc:10:28: required from ‘Foo<std::array<double, 3>, FS<float>::bdrs>::VaxisType Foo<std::array<double, 3>, FS<float>::bdrs>::axis_’
boost_no_workie-2.cc:22:47: required from ‘auto Bar<C, array_>::idx(double) [with C = std::array<double, 3>; const C& array_ = FS<float>::bdrs]’
boost_no_workie-2.cc:34:40: required from ‘auto FS<Base>::idx(double) [with Base = float]’
boost_no_workie-2.cc:41:25: required from here
/usr/include/boost/histogram/axis/variable.hpp:95:18: error: no match for ‘operator<=’ (operand types are ‘const std::array<double, 3>’ and ‘__gnu_cxx::__alloc_traits<std::allocator<double>, double>::value_type’ {aka ‘double’})
95 | if (*begin <= v.back())
... skip ...
/usr/include/boost/histogram/axis/variable.hpp:93:5: required from ‘boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::variable(It, It, boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::metadata_type, boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::allocator_type) [with It = const std::array<double, 3>*; <template-parameter-2-2> = boost::histogram::detail::requires_iterator<const std::array<double, 3>*, void>; Value = double; MetaData = boost::use_default; Options = boost::use_default; Allocator = std::allocator<double>; boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::metadata_type = std::__cxx11::basic_string<char>; boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::allocator_type = std::allocator<double>]’
/usr/include/boost/histogram/axis/variable.hpp:122:77: required from ‘boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::variable(std::initializer_list<_Up>, boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::metadata_type, boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::allocator_type) [with U = std::array<double, 3>; Value = double; MetaData = boost::use_default; Options = boost::use_default; Allocator = std::allocator<double>; boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::metadata_type = std::__cxx11::basic_string<char>; boost::histogram::axis::variable<Value, MetaData, Options, Allocator>::allocator_type = std::allocator<double>]’
boost_no_workie-2.cc:10:28: required from ‘Foo<std::array<double, 3>, FS<float>::bdrs>::VaxisType Foo<std::array<double, 3>, FS<float>::bdrs>::axis_’
boost_no_workie-2.cc:22:47: required from ‘auto Bar<C, array_>::idx(double) [with C = std::array<double, 3>; const C& array_ = FS<float>::bdrs]’
boost_no_workie-2.cc:34:40: required from ‘auto FS<Base>::idx(double) [with Base = float]’
boost_no_workie-2.cc:41:25: required from here
/usr/include/c++/9/ext/new_allocator.h:145:20: error: cannot convert ‘const std::array<double, 3>’ to ‘double’ in initialization
145 | noexcept(noexcept(::new((void *)__p)
| ^~~~~~~~~~~~~~~~~~
146 | _Up(std::forward<_Args>(__args)...)))
【问题讨论】:
-
好的,刚刚更新。它似乎与将 array_ 视为指针(~C 风格)而不是(通过变量 ctor)变成迭代器的东西有关。请注意,通过初始化列表初始化 axis_ 确实有效。
标签: c++ boost histogram axis stdarray