BOOST ::变体无法解决运算符<<对于STD :: Ostream

Boost::variant could not resolve operator<< for std::ostream

本文关键字:lt STD Ostream 对于 解决 BOOST 运算符      更新时间:2023-10-16

我不太了解发生了什么。我正在使用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