[Bug c++/68515] New: std::result_of<F(X)> doesn't work when F is abstract (with pure virtual functions)
naupacte at sfr dot fr
gcc-bugzilla@gcc.gnu.org
Tue Nov 24 11:23:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68515
Bug ID: 68515
Summary: std::result_of<F(X)> doesn't work when F is abstract
(with pure virtual functions)
Product: gcc
Version: 5.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: naupacte at sfr dot fr
Target Milestone: ---
I had to replace 'typename std::result_of<F(X)>::type' by
'decltype(std::declval<F>()(X()))'
All is in the title. Here is an example:
template <class T, class F, class R=typename result_of<F(T)>::type> vector<R>
make_result(const vector<T>& x, const F& f)
{
auto n = x.size();
vector<R> y(n);
for (uint i=0; i<n; i++) y[i] = f(x[i]);
return y;
}
template <class R, class T> struct virtual_func
{
R operator()(T x) const { return _get(x);}
virtual R _get(T) const = 0;
}
template <class R, class T> struct virtual_sqrt : virtual_func<R,T>
{
virtual R _get(T x) const { return std::sqrt(x);}
}
std::vector<double> sqrt(const std::vector<double>& v)
{
return make_result(v,virtual_sqrt{});
}
/opt/local/bin/gcc-mp-5 --version
gcc-mp-5 (MacPorts gcc5 5.2.0_0) 5.2.0
/opt/local/bin/gcc-mp-5 -x c++ -m64 -std=gnu++14 -c foo.cpp
>>>>>>>>>>>
error: no matching function for call to 'make_result(const vector<double>&,
const virtual_func<double,double>&)'
note: template argument deduction/substitution failed:
error: invalid abstract return type 'virtual_func<double>'
template <class T, class F, class R=Result_of<F(T)>> vector<R>
make_result(const vector<T>& x, const F& f) { auto n = x.size(); vector<R>
y(n); for (uint i=0; i<n; i++) y[i] = f(x[i]); return y;}
^
note: because the following virtual functions are pure within
'virtual_func<double>':
template <class R, class T> struct virtual_func
^
note: R virtual_func<R,T>::_get(T) const [with R = double; T = double]
virtual R _get(T) const = 0;
NB: here are the implementation details:
More information about the Gcc-bugs
mailing list