c++ - 使用默认参数的构造函数模板实例化

标签 c++ templates arguments

我有一个构造函数原型(prototype),如下所示:

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

error C2660: 'window' : function does not take 4 arguments

然后我尝试指定类型:

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

但这不起作用:

error C2512: 'window' : no appropriate default constructor available
error C2062: type 'int' unexpected

我做了一些研究,我能得到的最接近的是问题“C++ template function default value”,除了在我的例子中,模板参数可以从第一个参数推断出来。

那么,我是卡住了还是遗漏了什么?

最佳答案

您不能为构造函数提供显式模板参数列表,并且不能从默认函数参数中推导出模板参数,因此 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 调用该构造函数是否有效作为 position范围?或者 vector<double> ?这可能有意义,具体取决于您的类型的作用,但并不总是有意义。

关于c++ - 使用默认参数的构造函数模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791390/

相关文章:

c++ - facet 的 get_time 不断失败

c++ - 显式赋值与隐式赋值

arrays - 从golang模板调用数组的方法

c++ - 我可以使用类级别的 typedef 作为基类的模板参数吗?

C++11 模板方法中的自动返回类型

C 程序帮助使用 getopt 和命令行参数在 Unix/Linux 中打开文件

java - 使 IntelliJ 标记所有参数而不仅仅是字符串参数

c++ - 如何处理前向声明中的 namespace ?

arguments - 是否可以从 visualforce apex 标签传递参数?

c++ - 为什么在使用 MinGW-w64 时 printf 会生成一个额外的函数?