C ++ - 如何解决函数重载歧义

时间:2015-07-15 15:18:08

标签: c++ c++11

考虑遵循简单的课程(请不要讨论有用性):

class Container
{
    public:
        Container(const long long &val); //construct the container with a long long
        Container(const long double &val); //construct the container with a long double
        Container(const std::string &val); //construct the container with a string
        Container(const Container &val); //copy constructor, implemented as copy and swap

        //explicit conversions are also included for other data types
        explicit operator long long() const; //explicit conversion to long long

    private:
        int dataType;
        void *data;
};

要构建对象,我会打电话:

Container cont(20); //or
Container cont2("some string");

但是编译器告诉我他无法解决对int的模糊构造函数调用。

这引出了我的问题,解决这种模棱两可的最佳和最干净的方法是什么 我应该使用某种模板化的构造函数看起来像这样:

Container<int> cont(20);

或使用显式强制转换或虚拟参数?

模板化的方式看起来像是我可以接受的妥协,但我确信实际的通话看起来会有所不同。

非常感谢任何见解!

2 个答案:

答案 0 :(得分:3)

只需为int添加一个消除歧义的构造函数:

Container(int i)
: Container(static_cast<long long>(i)) // or whichever version you want
                                       // to call
{ }

答案 1 :(得分:0)

您可以使用由类型:

模板化的构造函数
class Container {
    template <class T> Container (const T& rhs);
};

在Boost中查看“any”的实现,以获得与您想要执行的操作类似的示例: http://www.boost.org/doc/libs/1_58_0/doc/html/boost/any.html