突然クラスのテンプレートメンバー関数の特殊化ができるか気になった


のでこんなコードをVC 2008 Express Editionでコンパイルしてみた。


#include
#include
#include

class Widget
{
public:
template
T foo(int i)
{
T tmp;
std::stringstream ss;
ss << i;
ss >> tmp;
return tmp;
}

template <>
int foo(int i) { return ++i; }
};

int main()
{
Widget w;
std::string s(w.foo(100));
int i = w.foo(100);
std::cout << "s:" << s << '\n';
std::cout << i << std::endl;

return 0;
}

あれ、すんなりコンパイルできちゃった。「cl /EHsc /Za」でもコンパイルできちゃう。
メンバー関数の特殊化って出来ないんじゃなかったかなーと思ってgcc4.3.2でもコンパイルしてみる。

error: explicit specialization in non-namespace scope 'class Widget'

ん?クラスWidgetの外で特殊化してねって事?
こうしてみた。


class Widget
{
public:
template
T foo(int i)
{
T tmp;
std::stringstream ss;
ss << i;
ss >> tmp;
return tmp;
}

template <>
int foo(int i);
};

template <>
int Widget::foo(int i) { return ++i; }

error: explicit specialization in non-namespace scope 'class Widget'

まぁそうだよね・・・。
VCでもgccでもコンパイルが通る用にするのは明日考えよう。眠いし。