作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为了序列化任何对象(即对于没有全局 ostream& operator<<
的对象,字符串为空),我创建了一个使用重载 std::ostream& operator<<
的函数。来自一个单独的命名空间;
namespace _impl {
template <typename T>
std::ostream& operator<<(std::ostream& osstr, const T& val) {
return osstr;
}
}
template <typename T>
std::string serialize_any(const T& val) {
using namespace _impl;
std::ostringstream osstr;
osstr<< val;
std::string str(osstr.str());
return str;
}
这适用于我尝试过的所有类型,除了 char 之外,其中 operator<< 被认为是不明确的。我不明白为什么它适用于 int、short 或任何其他定义了运算符的类型,但不适用于 char。有人有什么想法吗?
1>application_src\general_experiments.cpp(39): error C2593: 'operator <<' is ambiguous
1> application_src\general_experiments.cpp(26): could be 'std::ostream &_impl::operator <<<T>(std::ostream &,const T &)'
1> with
1> [
1> T=char
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\ostream(914): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,_Elem)' [found using argument-dependent lookup]
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\ostream(827): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' [found using argument-dependent lookup]
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\ostream(742): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' [found using argument-dependent lookup]
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> while trying to match the argument list '(std::ostringstream, const char)'
1> application_src\general_experiments.cpp(52) : see reference to function template instantiation 'std::string serialize_any<char>(const T &)' being compiled
1> with
1> [
1> T=char
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
最佳答案
编译器似乎从 const char&
进行了转换至 char
与向上转换处于同一水平std::ostringstream
至 std::ostream
当重载决议到来时。
解决方案可能是模板化 operator<<
的类型避免向上转型:
namespace _impl {
template <typename T, typename Y>
Y& operator<<(Y& osstr, const T& val) {
return osstr;
}
}
关于c++ - std::ostream& operator<<(std::ostream& sstr, const T& val) 的模糊重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16017354/
为了序列化任何对象(即对于没有全局 ostream& operator std::ostream& operator std::string serialize_any(const T& val) {
我是一名优秀的程序员,十分优秀!