【问题标题】:Constructor template instantiation with default arguments使用默认参数的构造函数模板实例化
【发布时间】:2012-05-28 23:17:12
【问题描述】:

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

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(即,它可以是intlongshort 等)。我得到了错误:

错误 C2660: 'window' : 函数不接受 4 个参数

然后我尝试指定类型:

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

但这不起作用:

错误 C2512:“窗口”:没有合适的默认构造函数可用
错误 C2062:意外键入“int”

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

那么,我是卡住了还是缺少了什么?

【问题讨论】:

  • 你用的是什么编译器?因为使用 VS2010 func("Hello");工作正常。
  • 你能发布一个简短的例子来重现你的问题吗?
  • 什么不起作用?你的建议对我有用:ideone.com/n0jgN
  • 对不起;我有一个更复杂的例子,我把它简化了。使用VS2010。谢谢,

标签: c++ templates arguments


【解决方案1】:

您不能为构造函数提供显式模板参数列表,并且不能从默认函数参数推导出模板参数,因此需要显式提供 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&lt;double&gt;?这可能有意义,具体取决于您的类型做什么,但并不总是有意义。

【讨论】:

    【解决方案2】:

    越想越觉得你只需要提供一个单独的构造函数即可:

    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
    )
    

    【讨论】:

    • OP 说它是一个 constructor 模板,而不仅仅是一个函数模板。
    • 该示例原本是一个简单的函数模板,但那是一种简化。在我的编辑中,我改变了它。很抱歉造成混乱。
    • @JonathanWakely:我回答后他改了问题。
    猜你喜欢
    • 2019-04-01
    • 2014-05-18
    • 2016-03-01
    • 2020-07-10
    • 1970-01-01
    • 2012-02-15
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多