Этот код, который принят другими компиляторами, завершается с ошибкой g++-4.1
:
template<typename T> struct foo;
template<template<typename> class ClassTemplate, typename Arg>
struct foo<ClassTemplate<Arg> >
{
typedef Arg type;
};
template<template<typename, typename> class ClassTemplate, typename Arg1, typename Arg2>
struct foo<ClassTemplate<Arg1,Arg2> >
{
typedef Arg1 type;
};
template<typename T1, typename T2 = int> class bar {};
int main()
{
typedef bar<int> test_me;
typedef foo<test_me>::type type;
return 0;
}
Вывод компилятора:
$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:20: error: ambiguous class template instantiation for ‘struct foo<bar<int, int> >’
test.cpp:5: error: candidates are: struct foo<ClassTemplate<Arg> >
test.cpp:11: error: struct foo<ClassTemplate<Arg1, Arg2> >
test.cpp:20: error: ‘type’ in class ‘foo<bar<int, int> >’ does not name a type
Существование bar
Параметр шаблона по умолчанию кажется виновником.
Есть ли другой способ, которым я мог бы реализовать foo
для этого компилятора?
Задача ещё не решена.
Других решений пока нет …