我有一个构造函数原型(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
无法明确指定(即,它可以是 int
或 long
或 短
等)。我收到错误:
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/