如何区分char literal和unsigned int作为构造函数的参数

时间:2015-12-02 19:31:43

标签: c++ constructor char unsigned

My Code有两个不同的构造函数,一个只有一个unsigned作为参数,另一个带有char和unsigned,其中unsigned有一个默认值。

Myclass::Myclass(unsigned);
Myclass::Myclass(const char, unsigned = 1);

问题在于,当我尝试以下操作时:

Myclass a = 'A';

调用仅带有unsigned as参数的构造函数(在此示例中为65)

在这种情况下如何调用第二个构造函数? 我也不希望0-255的值仅被解释为Ascii值。

编辑:

显示错误的示例代码:

部首:

#ifndef Myclass_H_
#define Myclass_H_

class Myclass {
public:
    Myclass(unsigned int = 10);
    Myclass(const char*);
    Myclass(char , unsigned int= 10);
    Myclass(const Myclass&);
    virtual ~Myclass();
};

#endif /* Myclass_H_ */

班级团体:

#include "Myclass.h"
#include <iostream>

using namespace std;

Myclass::Myclass(unsigned int)
{
    cout << "unsigned" << endl;
}
Myclass::Myclass(const char*)
{
    cout << "pointer" << endl;
}
Myclass::Myclass(char , unsigned int)
{
    cout << "char" << endl;
}
Myclass::Myclass(const Myclass&)
{
    cout << "copy" << endl;
}
Myclass::~Myclass(){}

int main()
{
    Myclass a = 'A';
    return 0;
}

显示&#34; unsigned&#34;在控制台中。

2 个答案:

答案 0 :(得分:2)

我无法复制您声明的问题。我用以下测试代码快速检查了一下:

#include <iostream>

struct foo {
    foo(const char, unsigned = 1) { std::cout << "Foo(char, unsigned)"; }
    foo(unsigned) {
        std::cout << "Foo(unsigned)";
    }
};

int main() {
    foo f = 'A';
}

...使用我编写的编译器(VC ++ 2013,VC ++ 2015,g ++ 4.8,g ++ 5.2),foo(char, unsigned)始终是所选择的(这是我所期望的)。

您使用哪种编译器为此输入选择其他重载?我希望这可以来自真正古老的编译器(遵循C规则,其中字符文字具有类型int而不是类型char),但这些已经过时了几十年。

答案 1 :(得分:1)

制作unsigned构造函数explicit,类似于:

Myclass {
    explicit Myclass (unsigned);
    // ...
}