https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84075

            Bug ID: 84075
           Summary: Template parameter not resolved: invalid application
                    of ‘sizeof’ to incomplete type
                    ‘boost::serialization::U’
           Product: gcc
           Version: 7.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: matteo-ml at member dot fsf.org
  Target Milestone: ---

Created attachment 43262
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43262&action=edit
Preprocessed file

I encounter the following error when building a C++ source file doing some
moderately deep template instantiation due to Eigen + Boost.Serialization. 
I cannot reproduce the same error on a minimal example, although I tried. Clang
builds the same sources fine (and the resulting linked binary runs correctly).
I can reproduce the same problem also with older g++ versions.

// -----------------------------------------

$ g++ -v
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 7.3.0-1'
--with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs
--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr
--with-gcc-major-version-only --program-suffix=-7
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object
--disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie
--with-system-zlib --with-target-system-zlib --enable-objc-gc=auto
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none --without-cuda-driver
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 7.3.0 (Debian 7.3.0-1) 

// -----------------------------------------

FAILED: CMakeFiles/gadv-backend.dir/gadv-backend/logic/petri-net.cc.o 
/usr/bin/g++  -Dgadv_EXPORTS -Dgadv_backend_EXPORTS
-I/home/matteo/Progetti/gadv/include -Iinclude
-I/home/matteo/Progetti/gadv/src/gadv-backend -isystem /usr/include/eigen3
-isystem /usr/include/pangomm-1.4 -isystem
/usr/lib/x86_64-linux-gnu/pangomm-1.4/include -isystem /usr/include/glibmm-2.4
-isystem /usr/lib/x86_64-linux-gnu/glibmm-2.4/include -isystem
/usr/include/cairomm-1.0 -isystem /usr/lib/x86_64-linux-gnu/cairomm-1.0/include
-isystem /usr/include/sigc++-2.0 -isystem
/usr/lib/x86_64-linux-gnu/sigc++-2.0/include -isystem /usr/include/pango-1.0
-isystem /usr/include/harfbuzz -isystem /usr/include/cairo -isystem
/usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include
-isystem /usr/include/pixman-1 -isystem /usr/include/freetype2 -isystem
/usr/include/libpng16 -ftemplate-backtrace-limit=0 -fdiagnostics-color=always
-O3 -DNDEBUG -fPIC -fvisibility=hidden -fvisibility-inlines-hidden   -Wall
-pedantic -fstack-protector-strong -std=gnu++1z -MD -MT
CMakeFiles/gadv-backend.dir/gadv-backend/logic/petri-net.cc.o -MF
CMakeFiles/gadv-backend.dir/gadv-backend/logic/petri-net.cc.o.d -o
CMakeFiles/gadv-backend.dir/gadv-backend/logic/petri-net.cc.o -c
/home/matteo/Progetti/gadv/gadv-backend/logic/petri-net.cc
In file included from /usr/include/eigen3/Eigen/Core:351:0,
                 from /usr/include/eigen3/Eigen/SparseCore:11,
                 from
/home/matteo/Progetti/gadv/include/gadv/logic/petri-net.hh:24,
                 from
/home/matteo/Progetti/gadv/gadv-backend/logic/petri-net.cc:18:
/usr/include/eigen3/Eigen/src/Core/NumTraits.h: In instantiation of ‘struct
Eigen::GenericNumTraits<boost::serialization::U>’:
/usr/include/eigen3/Eigen/src/Core/NumTraits.h:150:29:   required from ‘struct
Eigen::NumTraits<boost::serialization::U>’
/usr/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h:109:30:   required
from ‘class
Eigen::SparseMatrixBase<Eigen::SparseMatrix<boost::serialization::U, 0, int> >’
/usr/include/eigen3/Eigen/src/SparseCore/SparseCompressedBase.h:36:7:  
required from ‘class
Eigen::SparseCompressedBase<Eigen::SparseMatrix<boost::serialization::U, 0,
int> >’
/usr/include/boost/serialization/split_free.hpp:58:13:   recursively required
by substitution of ‘template<class Archive, template<class U> class SPT> void
boost::serialization::load(Archive&, SPT<boost::serialization::U>&, unsigned
int) [with Archive = boost::archive::xml_iarchive; SPT = <missing>]’
/usr/include/boost/serialization/split_free.hpp:58:13:   required from ‘static
void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&,
unsigned int) [with Archive = boost::archive::xml_iarchive; T =
Eigen::Triplet<long int, long int>]’
/usr/include/boost/serialization/split_free.hpp:74:18:   required from ‘void
boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive =
boost::archive::xml_iarchive; T = Eigen::Triplet<long int, long int>]’
/home/matteo/Progetti/gadv/gadv-backend/logic/serialization-helpers.tcc:55:16: 
 required from ‘void boost::serialization::serialize(Archive&,
Eigen::Triplet<Scalar, Index>&, boost::serialization::version_type) [with
Archive = boost::archive::xml_iarchive; Scalar = long int; Index = long int]’
/usr/include/boost/serialization/serialization.hpp:126:14:   required from
‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with
Archive = boost::archive::xml_iarchive; T = Eigen::Triplet<long int, long
int>]’
/usr/include/boost/archive/detail/iserializer.hpp:188:40:   required from ‘void
boost::archive::detail::iserializer<Archive,
T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned
int) const [with Archive = boost::archive::xml_iarchive; T =
Eigen::Triplet<long int, long int>]’
/usr/include/boost/archive/detail/iserializer.hpp:120:1:   required from ‘class
boost::archive::detail::iserializer<boost::archive::xml_iarchive,
Eigen::Triplet<long int, long int> >’
/usr/include/boost/archive/detail/iserializer.hpp:410:13:   required from
‘static void
boost::archive::detail::load_non_pointer_type<Archive>::load_standard::invoke(Archive&,
const T&) [with T = Eigen::Triplet<long int, long int>; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/iserializer.hpp:462:22:   required from
‘static void
boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&)
[with T = Eigen::Triplet<long int, long int>; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/iserializer.hpp:618:18:   required from ‘void
boost::archive::load(Archive&, T&) [with Archive =
boost::archive::xml_iarchive; T = Eigen::Triplet<long int, long int>]’
/usr/include/boost/archive/detail/common_iarchive.hpp:66:22:   required from
‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&) [with
T = Eigen::Triplet<long int, long int>; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/basic_xml_iarchive.hpp:78:9:   required from ‘void
boost::archive::basic_xml_iarchive<Archive>::load_override(const
boost::serialization::nvp<T>&) [with T = Eigen::Triplet<long int, long int>;
Archive = boost::archive::xml_iarchive]’
/usr/include/boost/archive/xml_iarchive.hpp:95:51:   required from ‘void
boost::archive::xml_iarchive_impl<Archive>::load_override(T&) [with T = const
boost::serialization::nvp<Eigen::Triplet<long int, long int> >; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/interface_iarchive.hpp:68:9:   required from
‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&)
[with T = const boost::serialization::nvp<Eigen::Triplet<long int, long int> >;
Archive = boost::archive::xml_iarchive]’
/usr/include/boost/serialization/collections_load_imp.hpp:72:12:   required
from ‘typename
boost::enable_if<boost::serialization::detail::is_default_constructible<typename
T::value_type>, void>::type
boost::serialization::stl::collection_load_impl(Archive&, T&,
boost::serialization::collection_size_type,
boost::serialization::item_version_type) [with Archive =
boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long
int>, std::allocator<Eigen::Triplet<long int, long int> > >; typename
boost::enable_if<boost::serialization::detail::is_default_constructible<typename
T::value_type>, void>::type = void]’
/usr/include/boost/serialization/vector.hpp:91:30:   required from ‘void
boost::serialization::load(Archive&, std::vector<U, Allocator>&, unsigned int,
mpl_::false_) [with Archive = boost::archive::xml_iarchive; U =
Eigen::Triplet<long int, long int>; Allocator =
std::allocator<Eigen::Triplet<long int, long int> >; mpl_::false_ =
mpl_::bool_<false>]’
/usr/include/boost/serialization/vector.hpp:159:9:   required from ‘void
boost::serialization::load(Archive&, std::vector<U, Allocator>&, unsigned int)
[with Archive = boost::archive::xml_iarchive; U = Eigen::Triplet<long int, long
int>; Allocator = std::allocator<Eigen::Triplet<long int, long int> >]’
/usr/include/boost/serialization/split_free.hpp:58:13:   required from ‘static
void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&,
unsigned int) [with Archive = boost::archive::xml_iarchive; T =
std::vector<Eigen::Triplet<long int, long int>,
std::allocator<Eigen::Triplet<long int, long int> > >]’
/usr/include/boost/serialization/split_free.hpp:74:18:   required from ‘void
boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive =
boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long
int>, std::allocator<Eigen::Triplet<long int, long int> > >]’
/usr/include/boost/serialization/vector.hpp:170:37:   required from ‘void
boost::serialization::serialize(Archive&, std::vector<U, Allocator>&, unsigned
int) [with Archive = boost::archive::xml_iarchive; U = Eigen::Triplet<long int,
long int>; Allocator = std::allocator<Eigen::Triplet<long int, long int> >]’
/usr/include/boost/serialization/serialization.hpp:126:14:   required from
‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with
Archive = boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long
int, long int>, std::allocator<Eigen::Triplet<long int, long int> > >]’
/usr/include/boost/archive/detail/iserializer.hpp:188:40:   required from ‘void
boost::archive::detail::iserializer<Archive,
T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned
int) const [with Archive = boost::archive::xml_iarchive; T =
std::vector<Eigen::Triplet<long int, long int>,
std::allocator<Eigen::Triplet<long int, long int> > >]’
/usr/include/boost/archive/detail/iserializer.hpp:120:1:   required from ‘class
boost::archive::detail::iserializer<boost::archive::xml_iarchive,
std::vector<Eigen::Triplet<long int, long int>,
std::allocator<Eigen::Triplet<long int, long int> > > >’
/usr/include/boost/archive/detail/iserializer.hpp:410:13:   required from
‘static void
boost::archive::detail::load_non_pointer_type<Archive>::load_standard::invoke(Archive&,
const T&) [with T = std::vector<Eigen::Triplet<long int, long int>,
std::allocator<Eigen::Triplet<long int, long int> > >; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/iserializer.hpp:462:22:   required from
‘static void
boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&)
[with T = std::vector<Eigen::Triplet<long int, long int>,
std::allocator<Eigen::Triplet<long int, long int> > >; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/iserializer.hpp:618:18:   required from ‘void
boost::archive::load(Archive&, T&) [with Archive =
boost::archive::xml_iarchive; T = std::vector<Eigen::Triplet<long int, long
int>, std::allocator<Eigen::Triplet<long int, long int> > >]’
/usr/include/boost/archive/detail/common_iarchive.hpp:66:22:   required from
‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&) [with
T = std::vector<Eigen::Triplet<long int, long int>,
std::allocator<Eigen::Triplet<long int, long int> > >; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/basic_xml_iarchive.hpp:78:9:   required from ‘void
boost::archive::basic_xml_iarchive<Archive>::load_override(const
boost::serialization::nvp<T>&) [with T = std::vector<Eigen::Triplet<long int,
long int>, std::allocator<Eigen::Triplet<long int, long int> > >; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/xml_iarchive.hpp:95:51:   required from ‘void
boost::archive::xml_iarchive_impl<Archive>::load_override(T&) [with T = const
boost::serialization::nvp<std::vector<Eigen::Triplet<long int, long int>,
std::allocator<Eigen::Triplet<long int, long int> > > >; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/interface_iarchive.hpp:68:9:   required from
‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&)
[with T = const boost::serialization::nvp<std::vector<Eigen::Triplet<long int,
long int>, std::allocator<Eigen::Triplet<long int, long int> > > >; Archive =
boost::archive::xml_iarchive]’
/home/matteo/Progetti/gadv/gadv-backend/logic/serialization-helpers.tcc:66:62: 
 required from ‘typename std::enable_if<std::is_convertible<Matrix*,
Eigen::SparseMatrixBase<SparseDerived>*>::value, void>::type
boost::serialization::load(Archive&, Matrix&,
boost::serialization::version_type) [with Archive =
boost::archive::xml_iarchive; Matrix = Eigen::SparseMatrix<long int, 0, long
int>; typename std::enable_if<std::is_convertible<Matrix*,
Eigen::SparseMatrixBase<SparseDerived>*>::value, void>::type = void]’
/usr/include/boost/serialization/split_free.hpp:58:13:   required from ‘static
void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&,
unsigned int) [with Archive = boost::archive::xml_iarchive; T =
Eigen::SparseMatrix<long int, 0, long int>]’
/usr/include/boost/serialization/split_free.hpp:74:18:   required from ‘void
boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive =
boost::archive::xml_iarchive; T = Eigen::SparseMatrix<long int, 0, long int>]’
/home/matteo/Progetti/gadv/gadv-backend/logic/serialization-helpers.tcc:99:16: 
 required from ‘typename std::enable_if<std::is_convertible<Matrix*,
Eigen::SparseMatrixBase<SparseDerived>*>::value, void>::type
boost::serialization::serialize(Archive&, Matrix&,
boost::serialization::version_type) [with Archive =
boost::archive::xml_iarchive; Matrix = Eigen::SparseMatrix<long int, 0, long
int>; typename std::enable_if<std::is_convertible<Matrix*,
Eigen::SparseMatrixBase<SparseDerived>*>::value, void>::type = void]’
/usr/include/boost/serialization/serialization.hpp:126:14:   required from
‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with
Archive = boost::archive::xml_iarchive; T = Eigen::SparseMatrix<long int, 0,
long int>]’
/usr/include/boost/archive/detail/iserializer.hpp:188:40:   required from ‘void
boost::archive::detail::iserializer<Archive,
T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned
int) const [with Archive = boost::archive::xml_iarchive; T =
Eigen::SparseMatrix<long int, 0, long int>]’
/usr/include/boost/archive/detail/iserializer.hpp:120:1:   required from ‘class
boost::archive::detail::iserializer<boost::archive::xml_iarchive,
Eigen::SparseMatrix<long int, 0, long int> >’
/usr/include/boost/archive/detail/iserializer.hpp:410:13:   required from
‘static void
boost::archive::detail::load_non_pointer_type<Archive>::load_standard::invoke(Archive&,
const T&) [with T = Eigen::SparseMatrix<long int, 0, long int>; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/iserializer.hpp:462:22:   required from
‘static void
boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&)
[with T = Eigen::SparseMatrix<long int, 0, long int>; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/iserializer.hpp:618:18:   required from ‘void
boost::archive::load(Archive&, T&) [with Archive =
boost::archive::xml_iarchive; T = Eigen::SparseMatrix<long int, 0, long int>]’
/usr/include/boost/archive/detail/common_iarchive.hpp:66:22:   required from
‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&) [with
T = Eigen::SparseMatrix<long int, 0, long int>; Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/archive/basic_xml_iarchive.hpp:78:9:   required from ‘void
boost::archive::basic_xml_iarchive<Archive>::load_override(const
boost::serialization::nvp<T>&) [with T = Eigen::SparseMatrix<long int, 0, long
int>; Archive = boost::archive::xml_iarchive]’
/usr/include/boost/archive/xml_iarchive.hpp:95:51:   required from ‘void
boost::archive::xml_iarchive_impl<Archive>::load_override(T&) [with T = const
boost::serialization::nvp<Eigen::SparseMatrix<long int, 0, long int> >; Archive
= boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/interface_iarchive.hpp:68:9:   required from
‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&)
[with T = const boost::serialization::nvp<Eigen::SparseMatrix<long int, 0, long
int> >; Archive = boost::archive::xml_iarchive]’
/usr/include/boost/archive/detail/interface_iarchive.hpp:75:32:   required from
‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator&(T&)
[with T = const boost::serialization::nvp<Eigen::SparseMatrix<long int, 0, long
int> >; Archive = boost::archive::xml_iarchive]’
/home/matteo/Progetti/gadv/gadv-backend/logic/petri-net.cc:310:8:   required
from ‘void gadv::PetriNet::serialize(Archive&, unsigned int) [with Archive =
boost::archive::xml_iarchive]’
/usr/include/boost/serialization/access.hpp:116:9:   required from ‘static void
boost::serialization::access::serialize(Archive&, T&, unsigned int) [with
Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’
/usr/include/boost/serialization/serialization.hpp:68:22:   required from ‘void
boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive =
boost::archive::xml_iarchive; T = gadv::PetriNet]’
/usr/include/boost/serialization/serialization.hpp:126:14:   required from
‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with
Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’
/usr/include/boost/archive/detail/iserializer.hpp:188:40:   required from ‘void
boost::archive::detail::iserializer<Archive,
T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned
int) const [with Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’
/usr/include/boost/archive/detail/iserializer.hpp:120:1:   required from ‘class
boost::archive::detail::iserializer<boost::archive::xml_iarchive,
gadv::PetriNet>’
/usr/include/boost/archive/detail/iserializer.hpp:369:31:   required from
‘boost::archive::detail::pointer_iserializer<Archive, T>::pointer_iserializer()
[with Archive = boost::archive::xml_iarchive; T = gadv::PetriNet]’
/usr/include/boost/serialization/singleton.hpp:100:7:   required from ‘static
T& boost::serialization::singleton<T>::get_instance() [with T =
boost::archive::detail::pointer_iserializer<boost::archive::xml_iarchive,
gadv::PetriNet>]’
/usr/include/boost/serialization/singleton.hpp:135:28:   required from ‘static
const T& boost::serialization::singleton<T>::get_const_instance() [with T =
boost::archive::detail::pointer_iserializer<boost::archive::xml_iarchive,
gadv::PetriNet>]’
/usr/include/boost/serialization/export.hpp:66:30:   required from ‘static
const boost::archive::detail::basic_pointer_iserializer&
boost::archive::detail::export_impl<Archive,
Serializable>::enable_load(mpl_::true_) [with Archive =
boost::archive::xml_iarchive; Serializable = gadv::PetriNet; mpl_::true_ =
mpl_::bool_<true>]’
/usr/include/boost/serialization/export.hpp:105:51:   required from ‘static
void boost::archive::detail::ptr_serialization_support<Archive,
Serializable>::instantiate() [with Archive = boost::archive::xml_iarchive;
Serializable = gadv::PetriNet]’
/usr/include/boost/serialization/export.hpp:86:1:   required from ‘struct
boost::archive::detail::ptr_serialization_support<boost::archive::xml_iarchive,
gadv::PetriNet>’
/usr/include/boost/archive/detail/register_archive.hpp:25:8:   required from
‘struct
boost::archive::detail::_ptr_serialization_support<boost::archive::xml_iarchive,
gadv::PetriNet>’
/usr/include/boost/archive/xml_iarchive.hpp:136:1:   required by substitution
of ‘template<class Serializable> typename
boost::archive::detail::_ptr_serialization_support<boost::archive::xml_iarchive,
Serializable>::type
boost::archive::detail::instantiate_ptr_serialization(Serializable*,
boost::archive::xml_iarchive*, boost::archive::detail::adl_tag) [with
Serializable = gadv::PetriNet]’
/usr/include/boost/serialization/export.hpp:123:38:   required from ‘void
boost::archive::detail::extra_detail::guid_initializer<T>::export_guid(mpl_::false_)
const [with T = gadv::PetriNet; mpl_::false_ = mpl_::bool_<false>]’
/usr/include/boost/serialization/export.hpp:133:20:   required from ‘const
boost::archive::detail::extra_detail::guid_initializer<T>&
boost::archive::detail::extra_detail::guid_initializer<T>::export_guid() const
[with T = gadv::PetriNet]’
/home/matteo/Progetti/gadv/gadv-backend/logic/petri-net.cc:47:1:   required
from here
/usr/include/eigen3/Eigen/src/Core/NumTraits.h:103:59: error: invalid
application of ‘sizeof’ to incomplete type ‘boost::serialization::U’
                      typename internal::conditional<sizeof(T)<=2, float,
double>::type,

// -----------------------------------------

Reply via email to