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无法明确指定的(即,它可以是intorlongshort等)。我得到错误:

错误 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如果您事先不知道它是什么,您打算如何处理该类型?某人以 astd::string作为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 回答