BOOST ::变体无法解决运算符<<对于STD :: Ostream
Boost::variant could not resolve operator<< for std::ostream
我不太了解发生了什么。我正在使用MSVC 2012,BOOST51。预计此代码可以正常工作,但不会汇编:
#include "stdafx.h"
#include <string>
#include <boost/variant/recursive_variant.hpp>
namespace NsSemSDK
{
struct STreeConstructionRuleRegexp {
std::string m_strEntity;
};
struct STreeConstructionRuleString {
std::string m_strEntity;
};
struct STreeConstructionRuleIdentifier {
std::string m_strEntity;
};
typedef int STreeConstructionRuleNumber;
typedef boost::variant<STreeConstructionRuleRegexp, STreeConstructionRuleNumber> STreeConstructionRuleOperand; // STreeConstructionRuleString, STreeConstructionRuleIdentifier
}
std::ostream& operator<<(std::ostream& stream, const NsSemSDK::STreeConstructionRuleRegexp& val)
{
return stream << ''' << val.m_strEntity << ''';
}
std::ostream& operator<<(std::ostream& stream, const NsSemSDK::STreeConstructionRuleString& val)
{
return stream << '"' << val.m_strEntity << '"';
}
std::ostream& operator<<(std::ostream& stream, const NsSemSDK::STreeConstructionRuleIdentifier& val)
{
return stream << val.m_strEntity;
}
using namespace NsSemSDK;
int _tmain(int argc, _TCHAR* argv[])
{
STreeConstructionRuleNumber num = 1024;
STreeConstructionRuleOperand operand = num;
std::cout << operand << std::endl;
}
我得到的是:
1>------ Build started: Project: ConsoleApplication3, Configuration: Debug Win32 ------
1> Source.cpp
1>c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantdetailvariant_io.hpp(64): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const T0' (or there is no acceptable conversion)
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(695): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const 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.0vcincludeostream(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> c:program files (x86)microsoft visual studio 11.0vcincludeostream(780): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const 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.0vcincludeostream(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.0vcincludeostream(953): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed 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.0vcincludeostream(960): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed 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.0vcincludeostream(967): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned 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.0vcincludeostream(974): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned 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.0vcincludeostream(984): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>,T>(std::basic_ostream<_Elem,_Traits> &&,const _Ty &)' [found using argument-dependent lookup]
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> T=T0,
1> _Ty=T0
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(1101): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)' [found using argument-dependent lookup]
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostblank.hpp(93): or 'std::basic_ostream<_Elem,_Traits> &boost::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const boost::blank &)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(201): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(207): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(214): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(221): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(241): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(275): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(295): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(320): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(340): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(360): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(381): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(401): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(422): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(442): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(462): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(482): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:program files (x86)microsoft visual studio 11.0vcincludeostream(502): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> while trying to match the argument list '(std::basic_ostream<_Elem,_Traits>, const T0)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantvariant.hpp(859) : see reference to function template instantiation 'void boost::detail::variant::printer<OStream>::operator ()<const T>(const T &) const' being compiled
1> with
1> [
1> OStream=std::basic_ostream<char,std::char_traits<char>>,
1> T=T0
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantvariant.hpp(859) : see reference to function template instantiation 'void boost::detail::variant::printer<OStream>::operator ()<const T>(const T &) const' being compiled
1> with
1> [
1> OStream=std::basic_ostream<char,std::char_traits<char>>,
1> T=T0
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantdetailvisitation_impl.hpp(130) : see reference to function template instantiation 'void boost::detail::variant::invoke_visitor<Visitor>::internal_visit<const T>(T &,int)' being compiled
1> with
1> [
1> Visitor=boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>,
1> T=T0
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantdetailvisitation_impl.hpp(130) : see reference to function template instantiation 'void boost::detail::variant::invoke_visitor<Visitor>::internal_visit<const T>(T &,int)' being compiled
1> with
1> [
1> Visitor=boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>,
1> T=T0
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantdetailvisitation_impl.hpp(173) : see reference to function template instantiation 'void boost::detail::variant::visitation_impl_invoke_impl<Visitor,VoidPtrCV,T>(int,Visitor &,VoidPtrCV,T *,boost::mpl::true_)' being compiled
1> with
1> [
1> Visitor=boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>>,
1> VoidPtrCV=const void *,
1> T=T0
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantdetailvisitation_impl.hpp(256) : see reference to function template instantiation 'void boost::detail::variant::visitation_impl_invoke<Visitor,VoidPtrCV,T0,NoBackupFlag>(int,Visitor &,VoidPtrCV,T *,NoBackupFlag,int)' being compiled
1> with
1> [
1> Visitor=boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>>,
1> VoidPtrCV=const void *,
1> NoBackupFlag=boost::variant<NsSemSDK::STreeConstructionRuleRegexp,NsSemSDK::STreeConstructionRuleNumber>::has_fallback_type_,
1> T=T0
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantvariant.hpp(1803) : see reference to function template instantiation 'void boost::detail::variant::visitation_impl<first_which,first_step,Visitor,VoidPtrCV,boost::variant<T0_,T1>::has_fallback_type_>(const int,const int,Visitor &,VoidPtrCV,boost::mpl::false_,NoBackupFlag,Which *,step0 *)' being compiled
1> with
1> [
1> Visitor=boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>>,
1> VoidPtrCV=const void *,
1> T0_=NsSemSDK::STreeConstructionRuleRegexp,
1> T1=NsSemSDK::STreeConstructionRuleNumber,
1> NoBackupFlag=boost::variant<NsSemSDK::STreeConstructionRuleRegexp,NsSemSDK::STreeConstructionRuleNumber>::has_fallback_type_,
1> Which=first_which,
1> step0=first_step
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantvariant.hpp(1825) : see reference to function template instantiation 'void boost::variant<T0_,T1>::internal_apply_visitor_impl<Visitor,const void*>(int,int,Visitor &,VoidPtrCV)' being compiled
1> with
1> [
1> T0_=NsSemSDK::STreeConstructionRuleRegexp,
1> T1=NsSemSDK::STreeConstructionRuleNumber,
1> Visitor=boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>>,
1> VoidPtrCV=const void *
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantvariant.hpp(1825) : see reference to function template instantiation 'void boost::variant<T0_,T1>::internal_apply_visitor_impl<Visitor,const void*>(int,int,Visitor &,VoidPtrCV)' being compiled
1> with
1> [
1> T0_=NsSemSDK::STreeConstructionRuleRegexp,
1> T1=NsSemSDK::STreeConstructionRuleNumber,
1> Visitor=boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>>,
1> VoidPtrCV=const void *
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantvariant.hpp(1847) : see reference to function template instantiation 'void boost::variant<T0_,T1>::internal_apply_visitor<boost::detail::variant::invoke_visitor<Visitor>>(boost::detail::variant::invoke_visitor<Visitor> &) const' being compiled
1> with
1> [
1> T0_=NsSemSDK::STreeConstructionRuleRegexp,
1> T1=NsSemSDK::STreeConstructionRuleNumber,
1> Visitor=boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantvariant.hpp(1847) : see reference to function template instantiation 'void boost::variant<T0_,T1>::internal_apply_visitor<boost::detail::variant::invoke_visitor<Visitor>>(boost::detail::variant::invoke_visitor<Visitor> &) const' being compiled
1> with
1> [
1> T0_=NsSemSDK::STreeConstructionRuleRegexp,
1> T1=NsSemSDK::STreeConstructionRuleNumber,
1> Visitor=boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantdetailvariant_io.hpp(88) : see reference to function template instantiation 'void boost::variant<T0_,T1>::apply_visitor<boost::detail::variant::printer<OStream>>(Visitor &) const' being compiled
1> with
1> [
1> T0_=NsSemSDK::STreeConstructionRuleRegexp,
1> T1=NsSemSDK::STreeConstructionRuleNumber,
1> OStream=std::basic_ostream<char,std::char_traits<char>>,
1> Visitor=boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3boostvariantdetailvariant_io.hpp(88) : see reference to function template instantiation 'void boost::variant<T0_,T1>::apply_visitor<boost::detail::variant::printer<OStream>>(Visitor &) const' being compiled
1> with
1> [
1> T0_=NsSemSDK::STreeConstructionRuleRegexp,
1> T1=NsSemSDK::STreeConstructionRuleNumber,
1> OStream=std::basic_ostream<char,std::char_traits<char>>,
1> Visitor=boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>
1> ]
1> c:usersvsevolod.sautadocumentsvisual studio 2012projectsconsoleapplication3consoleapplication3source.cpp(47) : see reference to function template instantiation 'std::basic_ostream<_Elem,_Traits> &boost::operator <<<char,std::char_traits<char>,NsSemSDK::STreeConstructionRuleRegexp,NsSemSDK::STreeConstructionRuleNumber,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_>(std::basic_ostream<_Elem,_Traits> &,const boost::variant<T0_,T1> &)' being compiled
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> T0_=NsSemSDK::STreeConstructionRuleRegexp,
1> T1=NsSemSDK::STreeConstructionRuleNumber
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我不知道什么是T0型,为什么将其铸造为T0。我希望它是内部的busost ::变体的内部内容。但是我仍然没有任何线索,为什么要到达那里:运营商"&lt;&lt;对于所有类型的变体都定义了。
您应该在名称空间NSSEMSDK内定义operator<<
,以便通过ADL找到这些功能。(示例。)
#include <string>
#include <iostream>
#include <boost/variant.hpp>
namespace NsSemSDK
{
struct STreeConstructionRuleRegexp {
std::string m_strEntity;
};
struct STreeConstructionRuleString {
std::string m_strEntity;
};
struct STreeConstructionRuleIdentifier {
std::string m_strEntity;
};
typedef int STreeConstructionRuleNumber;
std::ostream& operator<<(std::ostream& stream,
const STreeConstructionRuleRegexp& val)
{
return stream << ''' << val.m_strEntity << ''';
}
std::ostream& operator<<(std::ostream& stream,
const STreeConstructionRuleString& val)
{
return stream << '"' << val.m_strEntity << '"';
}
std::ostream& operator<<(std::ostream& stream,
const STreeConstructionRuleIdentifier& val)
{
return stream << val.m_strEntity;
}
typedef boost::variant<
STreeConstructionRuleRegexp,
STreeConstructionRuleNumber
> STreeConstructionRuleOperand;
// STreeConstructionRuleString, STreeConstructionRuleIdentifier
}
using namespace NsSemSDK;
int main()
{
STreeConstructionRuleNumber num = 1024;
STreeConstructionRuleOperand operand = num;
std::cout << operand << std::endl;
}
输出
1024
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++运算符<<调用::ostream而不是std::osttream
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- C++重载<<具有typedef'd std::vector
- 以x的倍数填充前导零,使用std::cout<<std::十六进制
- 错误:没有匹配'运算符<<"在'std::cout
- std::pair的默认构造函数<>将基本类型(int等)设置为零
- std::ostream&operator< & lt; (std:: ostream&压力,压力& &;val)
- 将std::endl传递给std::operator<<
- std::映射<>或std::vector<>在处理大型标志集时
- 重载& lt; & lt;使用命名空间std