クラスWidgetには、すべてのパラメータータイプに適用されるいくつかの関数(共通関数)と、特定のタイプに特化する必要があるその他の関数(一般的でない関数)があります。
g ++は、ウィジェットの特殊化はuncommon_fn()だけでなくcommon_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 );
}
開始-編集
アルフへ:
使えない
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 ....; }
?
終了編集
begin-edit2
iammilindへ:
これは興味深いことですが、同じ理由でWidgetからの派生(または共通部分を親クラスGeneralWidgetにリファクタリングするより明確なソリューション)を使用することはできません。共通部分は完全に共通ではありません。それらの宣言と定義は同じように見えますが、特性を使用しているため、最終的にはまったく異なります。
end-edit2