0

以下を検討してください

#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: 完全なテンプレートの特殊化で動作しますが、部分的な特殊化のみが必要です。

4

1 に答える 1

2

テンプレートを使用する場合、実際には、テンプレートの特殊化であっても、新しい型を定義しています。

したがって、プログラムが機能する正しい方法は、専門化を完全に再定義することです。

#include <iostream>

template <typename T, bool B>
struct C {
    T f(T v);
};

template <bool B>
struct C<int,B> {
  int f(int v) {
    return v;
  }
};

int main(int argc, char * argv[]) {
    C<int, true> c;
    std::cout << c.f(5) << std::endl;
    return 0;
}
于 2013-08-13T23:50:23.120 に答える