首页 > 解决方案 > 重载多个可变参数构造函数

问题描述

我有一个模板类,其中一个构造函数具有可变参数。最近我添加了另一个可变参数构造函数,但是由于不明确的函数重载调用,调用原始可变参数构造函数会导致编译时错误。

这个类看起来像

#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++

解决方案


首先,不要使用可变参数。它是 C 的遗物,模板可变参数在各个方面都更好。

话虽如此,问题在于 int 可以转换为MyClass<T>由于第一个构造函数,并且由于它只涉及一个用户转换,因此对于第二个构造函数来说是一个可行的选择。

一种解决方案是使 ctor(s) 明确:

template <typename T>
class MyClass
{
public:
explicit MyClass(int num_args, ...);

MyClass(MyClass<T> old, int num_args, ...);
};

如果你觉得这样,你可以明确第二个。


推荐阅读