C++;操作数到标准运算符的隐式转换 我在理解C++使用隐式转换的条件时遇到了一些困难。假设我有一门课: class SomeClass { private: int val; public: SomeClass(int i) :val{ i } {} operator string() { return to_string(val); } };
为什么在将此类与运算符一起使用时,我需要强制转换为字符串?为什么它不隐式地执行转换呢 代码:C++;操作数到标准运算符的隐式转换 我在理解C++使用隐式转换的条件时遇到了一些困难。假设我有一门课: class SomeClass { private: int val; public: SomeClass(int i) :val{ i } {} operator string() { return to_string(val); } };,c++,visual-c++,operators,implicit-conversion,C++,Visual C++,Operators,Implicit Conversion,为什么在将此类与运算符一起使用时,我需要强制转换为字符串?为什么它不隐式地执行转换呢 代码: int main(无效) { 某些类别sc=4; coutstd::cout不接受std::string 它接受模板化的std::basic_字符串,其参数将被推导。 有关更多详细信息,请参阅 我们考虑下面的例子: #include<string> struct SomeClass { operator std::string() { return ""; } }; templa
int main(无效)
{
某些类别sc=4;
coutstd::cout
不接受std::string
它接受模板化的std::basic_字符串
,其参数将被推导。
有关更多详细信息,请参阅
我们考虑下面的例子:
#include<string>
struct SomeClass {
operator std::string() { return ""; }
};
template <class CharT, class Traits, class Allocator>
void f(const std::basic_string<CharT, Traits, Allocator> &) {}
template <class CharT, class Traits, class Allocator>
void f(std::basic_string<CharT, Traits, Allocator> &) {}
int main(void) {
SomeClass sc{};
f((std::string)sc);
//f(sc);
}
#包括
结构类{
运算符std::string(){return”“;}
};
模板
void f(const std::basic_string&){
模板
void f(std::basic_string&){
内部主(空){
SomeClass-sc{};
f((标准::字符串)sc);
//f(资深大律师);
}
这与您的情况类似。
当然,f(sc)
编译的原因几乎相同
问题是,要推断模板参数SomeClass
应该转换为std::string
。要将其转换为std::string
,编译器应该猜测存在有效的重载并尝试使用它。无论如何,从模板参数的角度来看,这样一个可行的函数并不存在仍然需要推导ters,为了推导ters,编译器应该猜测在强制转换之后,SomeClass
的重载存在。它不能,因为……等等
<>我还没有检查过,但我敢打赌,类似的东西也适用于<代码>运算符+<代码> > .< /p> ,当你写“代码> cOUT时,它会被使用,以便更兼容C++标准库函数(没有强制转换)。我应该对<代码> Basic字符串S/<代码>进行隐式转换,而不是String。@ ApOrVaKaHARCHNO,<代码> String 是一个特定的实例化的代码:<代码> Basic字符串Stry< /C> >,是否<代码>操作程序,那么,更兼容C++标准库函数(没有强制转换)。,我应该写到basic_string
的隐式转换,而不是string?在这个答案之后不久,编辑历史让它看起来像是你基本上复制了我的,但是编辑历史误导了我。你发布了一个错误的答案,当你意识到这一点时删除了它,并最终修复了它。最后,我们只是简单地发布了same同时回答。如果这恰好是有人否决的原因,请让该人恢复否决票。@hvd确切地说,我们在同一时间发布了或多或少两个相同的答案,当然,我的答案是以前发布的错误答案的编辑。:-…无论如何,别担心,伤害我的不是否决票,而是错误答案事实上,它没有被解释,如果我不知道读者出了什么问题,我就无法改进答案。
#include<string>
struct SomeClass {
operator std::string() { return ""; }
};
template <class CharT, class Traits, class Allocator>
void f(const std::basic_string<CharT, Traits, Allocator> &) {}
template <class CharT, class Traits, class Allocator>
void f(std::basic_string<CharT, Traits, Allocator> &) {}
int main(void) {
SomeClass sc{};
f((std::string)sc);
//f(sc);
}
template <class CharT, class Traits, class Allocator>
std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os,
const std::basic_string<CharT, Traits, Allocator>& str);