異なる戻り型を持つ明示的な特殊化テンプレートクラスメンバー関数

c++ templates unix
異なる戻り型を持つ明示的な特殊化テンプレートクラスメンバー関数

いくつかのC コードをWindowsからSolaris(Unix)に移植しようとしています。 変更が必要なテンプレートコードがいくつかあります。 SolarisのコンパイラCCを使用していますが、g でも同じ問題が発生するはずです。

コードの特定の部分にいくつかのトラブルが発生しています。 次のように簡略化されています。

#include
#include
#include
#include

// define the "not implement" error
class tempException: public std::exception
{
public:
    virtual const char* what() const throw()
    {
        return "not been implemented!";
    }
} nondeferr;

// the template class
template
class A
{
public:
    template
    Val getValue(T t) { throw nondeferr; }

    template<>
    double getValue(T t) { return exp( 1.5 * t ); } //Specialize the getValue for double type.
};

// test code
int main()
{
    try
    {
        A testA;

        std::cout << testA.getValue(2) << std::endl;
        std::cout << testA.getValue(2) << std::endl;
    }
    catch (tempException& e)
    {
        std::cout << e.what() << std::endl;
    }

return 0;
}

このサンプルコードをUNIXでコンパイルすると、明示的な特殊化をクラスAスコープに含めることができないため、コンパイルエラーが発生します。

ここで、getValue関数は戻り値の型とのみ異なるため、オーバーロード方法を使用して変更することはできません。

また、何らかの理由で、単純なテンプレート変数Tを持つクラスAを、二重テンプレート変数TとValを持つクラスAに変更することは許可されていません。 この基本クラスを使用しようとすると、多くの変更が導入されます。

解決策があるかどうか知っていますか? 現在、getValue関数を削除し、getDoubleValueに置き換えています…​ しかし、それもあまり良くありません。

” ” ‘

興味のある人にとって、クラスAは次のようになります。

template
class A
{
public:
    // the Get Value we want
    template
    R getValue(T t) { return get_value_impl::apply(*this, t); }

    // the general get value struct
    template
    struct get_value_impl
    {
        static R apply(A a, T t) { throw nondeferr; }
    };

    // partial specialization, which is allowed in std C++
    template
    struct get_value_impl
    {
        static double apply(A a, T t) { return exp( 1.5 * t ); }
    };
};

背後のロジックは、明示的な特殊化は標準では許可されていません。 ただし、部分的な特殊化は許可されています。 素晴らしいソリューションを提供してくれたAnycornに感謝します。

  1  2


ベストアンサー

// the template class
template
class A {
    template<>
    double getValue(T t) { return exp( 1.5 * t ); }
};

これは標準では許可されていません。

do:

template
class A {
    template
    R getValue(T t) { return get_value_impl::apply(*this, t); }
    template
    struct get_value_impl; // specialize this
};

3


周囲のクラスを特化せずにメンバー関数を特化することはできません。 Visual Studioでは、これを拡張機能として許可しています。

3


タイトルとURLをコピーしました