Приведенный ниже код теста отлично работает с GCC 4.8 (и 4.7):
#include <type_traits>
template<typename T, T &object, typename... Args>
struct Functor
{
template<float (T::*function)(Args...), Args... args>
struct Inner
{
float operator()() const
{
return (object.*function)(args...);
}
};
};
class Object
{
public:
float someFunction()
{
return {};
}
float someFunctionWithArgument(int)
{
return {};
}
};
Object object;
Functor<Object, object>::template Inner<&Object::someFunction> functor1;
Functor<Object, object, int>::template Inner<&Object::someFunctionWithArgument, 1> functor2;
int main()
{
}
Однако с GCC 4.9 он терпит неудачу с довольно бесполезным сообщением в момент создания functor1
:
$ g++ -std=c++11 test.cpp
test.cpp: In instantiation of ‘struct Functor<Object, (* & object)>’:
test.cpp:33:24: required from here
test.cpp:7:9: error: wrong number of template arguments (2, should be 1)
struct Inner
^
test.cpp:7:9: error: provided for ‘template<class T, T& object, class ... Args> template<float (T::* function)(Args ...), Args ...args> struct Functor<T, object, Args>::Inner’
test.cpp:7:9: error: wrong number of template arguments (2, should be 1)
test.cpp:7:9: error: provided for ‘template<class T, T& object, class ... Args> template<float (T::* function)(Args ...), Args ...args> struct Functor<T, object, Args>::Inner’
test.cpp:33:35: error: ‘Inner’ in ‘struct Functor<Object, (* & object)>’ does not name a template type
Functor<Object, object>::template Inner<&Object::someFunction> functor1;
Если я прокомментирую строку с помощью functor1
, все остальное (functor2
) отлично работает.
Любые идеи, как решить это?
EDIT:
Я сообщил об ошибке в GCC - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64514, который мы увидим...