2

WRONG とマークされたオブジェクトを作成するにはどうすればよいですか? 部分的に特化したテンプレートクラスです。

template<typename C, typename size_type = unsigned short>
struct MatrixDataRect {...};

template<typename T, size_t H, size_t W>
class MatrixDataRect<std::array<T,H*W>, size_t> {...};

int main()
{
    MatrixDataRect<std::vector<double>> mat_data_vector;
    MatrixDataRect<std::array<double,10*5>> mat_data_array; // WRONG!!!!
    return 0;
}

WRONG 行は最初のテンプレート クラスを使用しているため、間違っています。2番目ではありません。コンパイラは H と W にそれぞれ 10*5 を割り当てることができないためです。

4

2 に答える 2

4
template<typename T, size_t H, size_t W>
class MatrixDataRect<std::array<T,H*W>, size_t> {...};
MatrixDataRect<std::array<double,10*5>> mat_data_array;

問題は、テンプレートの引数 H と W が呼び出しの場所から推測できないことです。基本的に、インスタンス化中に、コンパイラーは乗算5*10して生成50し、インスタンス化を試みます。std::array<double,50>次に、インスタンス化された型を使用してインスタンス化しますMatrixDataRect<std::array<double,50>>。この時点で、Hとの値が何であるかを把握することは不可能WですMatrixDataRect(5 と 10 ですか?、10 と 5 ですか?、25 と 2 ですか?...)。

型推定を適用できないため、コンパイラは特殊化されていないバージョンにフォールバックし、メイン テンプレートをインスタンス化します。

使用できる代替手段は次のとおりです: 特殊化がstd::array単一のサイズ引数を取るようにします (メイン テンプレートとして)。これは問題のすべてのコードで機能しますが、2 つの次元が必要な場合は他のメンバーでは機能しない可能性があります。サイズが明示的に渡されるようにテンプレートを変更します。

于 2013-03-03T18:40:05.453 に答える
2

2 つの問題があります。

  1. 10*5は 50 に評価され、コンパイラはH*W実行できないものを推測しようとします。size_tこれらは、乗算して 50 になる任意の値である可能性があります。

  2. 2 番目のテンプレート引数として特殊size_t化しています。これは、推測できないため、インスタンス化するときに指定する必要があります。それ以外の場合は、インスタンス化するだけですMatrixDataRect<std::array<double,10*5>, unsigned short>

次のように動作します。

template<typename C, typename size_type = unsigned short>
struct MatrixDataRect {...};

template<typename T, size_t S>
class MatrixDataRect<std::array<T,S>, size_t> {...};

int main()
{
    MatrixDataRect<std::vector<double>> mat_data_vector;
    MatrixDataRect<std::array<double,10*5>, size_t> mat_data_array;
    return 0;
}
于 2013-03-03T18:43:00.803 に答える