3
다음 코드 :boost :: variant를 사용하여이 사용자 정의 유형을 방문 할 수없는 이유는 무엇입니까?
#include <boost/variant.hpp>
#include <iostream>
#include <string>
struct A
{
A()
{
}
~A() throw()
{
}
A& operator=(A const & rhs)
{
return *this;
}
bool operator==(A const & rhs)
{
return true;
}
bool operator<(A const & rhs)
{
return false;
}
};
std::ostream & operator<<(std::ostream & os, A const & rhs)
{
os << "A";
return os;
}
typedef boost::variant<int, std::string, A> message_t;
struct dispatcher_t : boost::static_visitor<>
{
template <typename T>
void operator()(T const & t) const
{
std::cout << t << std::endl;
}
};
int main(int argc, char * const * argv)
{
message_t m("hi");
boost::apply_visitor(dispatcher_t(), m);
message_t a(A());
boost::apply_visitor(dispatcher_t(), a);
}
다음과 같은 오류를 얻을 수 있습니다.
In file included from /usr/include/boost/variant/apply_visitor.hpp:17,
from /usr/include/boost/variant.hpp:24,
from main.cpp:2:
/usr/include/boost/variant/detail/apply_visitor_unary.hpp: In function ‘typename Visitor::result_type boost::apply_visitor(const Visitor&, Visitable&) [with Visitor = dispatcher_t, Visitable = message_t(A (*)())]’:
main.cpp:51: instantiated from here
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:72: error: request for member ‘apply_visitor’ in ‘visitable’, which is of non-class type ‘message_t(A (*)())’
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:72: error: return-statement with a value, in function returning 'void'
나는 원래 그냥 아주 간단를 사용하여 시도하지만 BoundedTypes에 모든 요구 사항 Boost.Variant 장소를 만족시키기 위해 노력했다. A는
struct A {};
방문자는 문자열 값으로 잘 작동하지만 심지어 내가 GCC-4.4.5을 사용하고 A.를 방문하는 시도를 컴파일 할 수 없습니다로 사용됩니다. 어떤 아이디어?
AH !!! 예, 저는 Meyers의 Effective * 책 중 하나에서 그것을 보았습니다. 고맙습니다. –
이 구문 분석 문제는 부울 유형에 대한 템플릿 변환 생성자가있는 부스트 :: 변형과 관련이 있습니까? –
@Ken : no -'boost :: variant'와 전혀 관련이 없습니다. * T 타입과 U 타입의 경우,'T a (U)() '; 형태의 문장은'a'라는 함수의 선언으로 간주되어'T'를 리턴하고' U 매개 변수. –