我有一个构造函数原型,如下所示:
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
或short
等。我收到错误:
错误C2660:'window':函数不带4个参数
然后我尝试指定类型:
new window<int>(screen_size,"My Window",NULL,fullscreen);
但这不起作用:
错误C2512:'window':没有合适的默认构造函数
错误C2062:输入'int'意外
我做了一些研究,关于我能得到的最接近的问题与“C++ template function default value”类似,只是在我的情况下,模板参数可以从第一个参数推断出来。 / p>
所以,我被困了还是有什么我想念的?
答案 0 :(得分: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
作为position
参数调用该构造函数是否有效?还是vector<double>
?它可能有意义,取决于你的类型做什么,但它并不总是有意义。
答案 1 :(得分: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
)