c++ - 重载多个可变参数构造函数
问题描述
我有一个模板类,其中一个构造函数具有可变参数。最近我添加了另一个可变参数构造函数,但是由于不明确的函数重载调用,调用原始可变参数构造函数会导致编译时错误。
这个类看起来像
#include <iostream>
template <typename T>
class MyClass
{
public:
MyClass(int num_args, ...)
{
//implementation
}
MyClass(MyClass<T> old, int num_args, ...)
{
//implementation
}
};
int main()
{
MyClass<int> m = MyClass<int>(5,2,2);
return 0;
}
这些和其他构造函数都单独工作,但是当包含第二个构造函数的定义时调用第一个构造函数会因为歧义而拒绝编译。有没有办法在 C++ 中有多个带有可变参数的构造函数?或者,有没有更好的方法来做上面的代码试图做的事情?
解决方案
首先,不要使用可变参数。它是 C 的遗物,模板可变参数在各个方面都更好。
话虽如此,问题在于 int 可以转换为MyClass<T>
由于第一个构造函数,并且由于它只涉及一个用户转换,因此对于第二个构造函数来说是一个可行的选择。
一种解决方案是使 ctor(s) 明确:
template <typename T>
class MyClass
{
public:
explicit MyClass(int num_args, ...);
MyClass(MyClass<T> old, int num_args, ...);
};
如果你觉得这样,你可以明确第二个。
推荐阅读
- mysql - 如何使用 Codeigniter 将两个不同的查询合并为一个查询
- haskell - Haskell 生成不正确的二维码
- android - 在 google play 控制台面板 APK 中,在 ALPHA 版本中尚未公开
- python - 如何在 HDP 中的 zeppelin-spark2 中将库安装到 python
- php - IntelliJ PHP 自定义检查:如何调用 visitPhpFunctionCall?
- c# - VirtualPathUtility 的 ASP.Net 核心替换
- python - 在 Airflow 中启动时执行代码
- uitextfield - UITextField 的基于块的 KVO
- java - 记录器输出到 JavaFX 中的 TextArea
- google-api - 适用于 Java SDK 和 GDPR 的 Google 客户端库