4

次のようなコンストラクターのプロトタイプがあります。

template <typename type_position> window(
    const int size[2],
    const char* caption="Window", const SDL_Surface* icon=NULL,
    bool fullscreen=false, bool vsync=true, bool resizable=false, int multisample=0,
    type_position position=type_position(0)
)

次に、インスタンスを作成します。

new window(screen_size,"My Window",NULL,fullscreen);

問題(私が推測する)は、T明示的に指定できないことです(つまり、intorまたはlongorshortなどである可能性があります)。エラーが発生します:

エラーC2660:'ウィンドウ':関数は4つの引数を取りません

次に、タイプを指定しようとしました。

new window<int>(screen_size,"My Window",NULL,fullscreen);

しかし、それは機能しません:

エラーC2512:'ウィンドウ':使用可能な適切なデフォルトコンストラクタがありません
エラーC2062:タイプ'int'予期しない

私はいくつかの調査を行いましたが、私の場合、テンプレートパラメータを最初の引数から推測できることを除いて、 「 C++テンプレート関数のデフォルト値」という質問に最も近いものを取得できました。

それで、私は立ち往生していますか、それとも私が欠けているものがありますか?

4

2 に答える 2

2

コンストラクターに明示的なテンプレート引数リストを指定することはできません。また、デフォルトの関数引数からテンプレートパラメーターを推定することはできないためtype_position position、型を推定するには、関数パラメーターを明示的に(デフォルトではなく)指定する必要があります。

これが最後のパラメーターであるため、コンストラクターのデフォルトの引数を使用できなくなります。コンストラクターパラメーターを並べ替えて、type_positionが最初に指定されるようにするか、ダミーの引数を追加して、それを推測できるようにすることができます。

template <typename type_position> window(
  type_position dummy,
  const int size[2],
  const char* caption="Window", const SDL_Surface* icon=NULL,
  bool fullscreen=false, bool vsync=true, bool resizable=false, int multisample=0,
  type_position position=type_position(0)
);

次に、推定されるタイプのダミーの最初のパラメーターを使用して呼び出します。

new window(1, screen_size,"My Window",NULL,fullscreen);

または、C ++ 11を使用している場合は、デフォルトのテンプレート引数を指定できます。

template <typename type_position = int> window(
  const int size[2],
  const char* caption="Window", const SDL_Surface* icon=NULL,
  bool fullscreen=false, bool vsync=true, bool resizable=false, int multisample=0,
  type_position position=type_position(0)
);

または、推定する必要のあるパラメーターを持つテンプレートコンストラクターが本当に必要かどうかを判断します。type_position事前にタイプがわからない場合は、そのタイプをどのように処理する予定ですか?誰かがパラメータstd::stringとしてaを使用してそのコンストラクタを呼び出すことは有効ですか?positionまたはvector<double>?タイプによっては意味があるかもしれませんが、必ずしも意味があるとは限りません。

于 2012-05-28T23:43:23.890 に答える
0

考えれば考えるほど、別のコンストラクターを提供する必要があるようです。

window(
    const int size[2],
    const char* caption="Window", const SDL_Surface* icon=NULL,
    bool fullscreen=false, bool vsync=true, bool resizable=false,
    int multisample=0,
    int position=0
)
于 2012-05-28T23:25:05.837 に答える