0

Test::load渡された参照にデータ(名前またはインデックスのいずれかで記述)をロードする必要があります。3番目のパラメーターとして、ロードが失敗した場合のデフォルト値があります(データはファイルからロードされます)。

struct Test
{
    template <typename ValueType, typename DefaultValueType>
    void load(const char * c, ValueType & a, DefaultValueType b)
    {
        std::cout << "1";
    }

    template <typename ValueType, typename DefaultValueType>
    void load(int i, ValueType & a, DefaultValueType b)
    {
        std::cout << "2";
    }
};

ValueType文字列とカスタムタイプが特に必要なDefaultValueTypeため、両方が必要です。const char *ValueTypeから推定されるデフォルトの3番目の引数(バージョン内)としてデフォルトの構築型を使用したい場合に問題が発生します。

template <typename ValueType, typename DefaultValueType>
void load(const char * c, ValueType & a, DefaultValueType b = ValueType())
{
    std::cout << "1";
}

エラーが発生しexpects 3 argumentsます(vs2010)。

なぜそれが機能しないのですか?私はこの仕事をするためにworkaroudをする必要があります。


誰かが遊んでみたいと思っているなら、ここに完全な「動作する」コードがあります

#include <iostream>

struct Test
{
    template <typename ValueType, typename DefaultValueType>
    void load(const char * c, ValueType & a, DefaultValueType b/* = ValueType()*/)
    {
        std::cout << "1";
    }

    template <typename ValueType, typename DefaultValueType>
    void load(int i, ValueType & a, DefaultValueType b)
    {
        std::cout << "2";
    }

    //Workaround
    template<typename ValueType>
    void load(const char * c, ValueType & v)
    {
        load(c,v,ValueType());
    }
};

int main()
{
   Test t;
   float f;

   //This is standard behavior
   t.load("bar", f, 0.0f);

   //I want this to be possible call
   t.load("bar", f);
}
4

1 に答える 1

2

部分的なテンプレートの特殊化を探しています。ただし、部分的なテンプレートの特殊化は、クラスに対してのみ可能であり、関数に対しては不可能です。関数の場合、オーバーロードによって問題を解決します。これは、回避策で行ったこととまったく同じです。

これは、テンプレート関数が特殊化ではなくオーバーロードを持っている理由についての記事です。

于 2012-12-18T17:26:30.103 に答える