2015-12-02 9 views
0

我的代码有2个不同的构造函数,一个只有一个无符号参数,另一个有一个char和一个无符号,其中unsigned具有默认值。如何区分字符型和无符号int作为构造函数的参数

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

问题IST,当我尝试以下方法:

Myclass a = 'A'; 

只用签名作为参数调用构造函数(在本例中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; 
} 

显示 “无符号”。

+0

您应该使构造函数明确,避免语义复杂化。 –

+0

我认为这个问题的答案是:获得一个有效的C++编译器!第二次过载显然更好。如果编译器在从字符文字转换时选择'unsigned'超载,那么这是错误的。你能提供一个显示问题的[SSCCE](http://sscce.org/)吗? –

+0

Re。 “编辑”,当然''A''不匹配'(char,unsigned int)'。你最初声称第二个参数有一个默认值。 –

回答

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),但那些已经过时数十年。

+0

MSVC++ 6.0仍然是......最受欢迎的环境吗? –

+0

@DietmarKühl:如果记忆力得到满足,即使它有这个权利。你必须回到像MSVC++ 4这样的东西。x(甚至可能是2.x)让这个错误。 –

+0

我在windows上使用mingw,所以gcc版本4.8.1的端口。 – JDNoodle

1

充分利用unsigned构造explicit,是这样的:

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