Класс Widget имеет некоторые функции, которые применяются для всех типов параметров (общие функции), и другие функции, которые должны быть специализированы для данных типов (необычные функции).
g ++ настаивает на том, чтобы специализация for 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 );
}
begin-edit
to 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 ....; }
?
end-edit
] begin-edit2
в iammilind:
Это интересно, но я не могу использовать производное от Widget (или возможно более ясное решение рефакторинга общих частей в родительский класс GeneralWidget) по той же причине. Общие части не совсем обычные. Их объявления и их определения выглядят одинаково, но из-за того, что они используют черты, они в конце совершенно разные.
end-edit2