C++ 对于自定义类,没有可行的int转换

C++ 对于自定义类,没有可行的int转换,c++,C++,我用以下方法编写了一个UTF8字符类: typedef uint32_t CodePoint; // This is meant to represent any unicode character explicit Char(const char c); explicit Char(const CodePoint cp); Char& operator=(const char c); Char& operator=(const CodePoint cp); 但是当我试图通

我用以下方法编写了一个UTF8字符类:

typedef uint32_t CodePoint; // This is meant to represent any unicode character

explicit Char(const char c);
explicit Char(const CodePoint cp);

Char& operator=(const char c);
Char& operator=(const CodePoint cp);
但是当我试图通过传递一个数字来构造一个新类时,我得到了一个错误:

utf8::Char c = 0x20AC; // No viable conversion from int to utf8::Char
utf8::Char c(0x20AC);  // Call to constructor of 'utf8::Char' is ambiguous
为什么我会看到这些错误

typedef uint32\u t码点;//这表示任何unicode字符

您是否意识到C++11为此定义了一个独特的
char32\t
类型

utf8::Char c=0x20AC;//从int到utf8::Char没有可行的转换

这不是一个任务,这是一个建设。此语法称为复制初始化,相当于:

utf8::Char c = utf8::Char(0x20AC);
除了从
int
utf8::Char
的转换是隐式的,因此不能使用
显式的
构造函数

utf8::Char c(0x20AC);//对“utf8::Char”构造函数的调用不明确

int
char
的转换并不比从
int
uint32\t
的转换好或坏

有没有一种方法可以说“除了
char
之外的所有内容都使用
CodePoint
构造函数”

<>是,C++类型系统中常用的“一切”方式是模板:

explicit Char(char c);
template<typename T>
  explicit Char(T cp);

0x20AC是数字,因此您必须提供另一个重载构造函数。

explicit
防止复制初始化。第二个原因是
int
可以像
uint32\u t
@chris一样轻松地转换为
char
,这已经修复了错误,谢谢!有没有一种方法可以说“除了
char
之外的所有内容都使用
CodePoint
构造函数”。有
char
初始化器是有利的,因为这意味着不需要执行编码。啊,现在一切都有意义了,抱歉我的无知,我不知道
char32\u t
或复制初始化。可能值得指出的是,任何时候你重载任何整数类型(包括
char
)时,您应该为
int
提供重载,正是因为这是整型文字的(默认)类型。模板构造函数可能不是一个好主意,因为它可以接受任何类型,并且您不希望它转换
double
或其他任何东西。@JamesKanze,是的,我打算建议约束模板,但决定它可能比OP需要的信息更多。不过我现在要编辑答案。注意:
char
构造函数将接受
double
参数,即使没有模板。@JonathanWakely我知道。我不知道如何最好地处理这种情况。(正如我所说,我只是重载
int
,以捕获整数常量,希望用户不是完全愚蠢。)
template<typename T>
  explicit Char(T cp)
  {
    static_assert(std::is_integral<T>::value, "utf8::Char should only be constructed from integral types");
  }