以下を検討してください
#include <iostream>
template <typename T, bool B>
struct C {
using value_type = T;
value_type f(value_type v);
};
template <bool B>
auto C<int, B>::f(value_type v) -> value_type {
return v;
}
int main(int argc, char * argv[]) {
C<int, true> c;
std::cout << c.f(5) << std::endl;
return 0;
}
g++ 4.9 を使用するとエラーが発生します
test.cpp:11:26: エラー: 'C::f' が 'inline' 変数として宣言されました
inline auto C::f(value_type v) -> value_type {
test.cpp:11:26: エラー: テンプレート定義の非テンプレート 'auto C::f'
test.cpp:11:26: エラー: 'value_type' はこのスコープで宣言されていません
問題はvalue_type
です。これを置き換えると機能しますtypename C<int, B>::value_type
が、これははるかに長く、特に実際のアプリケーションでは非常に長くなる可能性があります(私の場合)。これを短いバリアントで機能させる方法はありますか?
PS: 完全なテンプレートの特殊化で動作しますが、部分的な特殊化のみが必要です。