У класса Widget есть некоторые функции, которые применяются ко всем типам параметров (общие функции) и другим функциям, которые должны быть специализированы для заданных типов (необычные функции).
g++ настаивает на том, что специализация для Widget также должна определять common_fn(), а не только uncommon_fn(), но это побеждает цель использования специализации в первую очередь. Как избежать повторения common_fn()?
#include <cassert>
template<typename Type> struct Widget
{
Widget() {}
char common_fn() { return 'a'; }
int uncommon_fn() { return 1; }
};
template<> struct Widget<char>
{
Widget() {}
int uncommon_fn() { return 2; }
};
int main()
{
Widget<char> WidgetChar;
assert( WidgetChar.common_fn() == 'a' ); // Error
assert( WidgetChar.uncommon_fn() == 2 );
}
начать-редактирования
в Alf:
Я не могу использовать
template<> int Widget<char>::uncommon_fn() { return 2; }
потому что некоторые из необычных функций должны возвращать тип признаков (и поэтому было чрезмерно упростить, создав примитив реального типа).
Или есть на самом деле способ заставить компилятор распознать typename Foo::Bar
при написании
struct Foo { typedef FooBar Bar; };
template<> typename Foo::Bar Widget<Foo>::uncommon_fn() { return ....; }
?
конец редактировать
начать-edit2
to iammilind:
Это интересно, но я не могу использовать вывод из Widget (или, возможно, более четкое решение для реорганизации общих частей в родительский класс GeneralWidget) по той же причине. Общие части не являются общими. Их декларации и их определения выглядят одинаково, но поскольку они используют черты, они в конце совершенно разные.
конец edit2