[ignore this line: it makes gmane stop complaining about top-posting]
------ Build started: Project: TR1TupleConversionProblem, Configuration:
Debug Win32 ------
1>Compiling...
1>stdafx.cpp
1>TR1TupleConversionProblem.cpp
1>[...]\boost_1_36_0\boost\fusion\sequence\intrinsic\begin.hpp(56) :
error C2504: 'boost::fusion::extension::begin_impl<Tag>::apply<Sequence>' :
Hi!
Trying to migrate existing code from boost::xxx to std::tr1::xxx using
the boost::tr1 implementation for Visual Studio 2005 SP1
In the presence of some exotic autoconversion utility the
the std::tr1::tuple version of my code fails on vc8.
The error messages indicate that the conversion operator
is not considered by the compiler.
Below is code that fails to compile on vc8 if USE_TR1 is defined
Do you have an idea how to fix this?
Thanx, Markus
---snip---
#include
#ifdef USE_TR1
#include
#else
#include
#endif
#include
#include <iostream>
namespace Core
{
class AutoConverter
{
std::tr1::shared_ptrboost::any t_;
public:
AutoConverter(std::tr1::shared_ptrboost::any const & t)
: t_(t)
{}
template <typename C>
operator C ()
{
try
{
boost::any & a = (*t_);
return boost::any_cast<C>(a);
}
catch(boost::bad_any_cast & e)
{
std::cerr << "Internal conversion bug: "
<< "Failed to convert data holder
to "
<< typeid(C).name() << "\n"
<< e.what()
<< std::endl;
C c = C();
return c;
}
}
};
inline AutoConverter Demo()
{
#ifdef USE_TR1
std::tr1::shared_ptrboost::any p_result
(new boost::any(std::tr1::make_tuple(1, 2, 3, 4)));
#else
std::tr1::shared_ptrboost::any p_result
(new boost::any(boost::make_tuple(1, 2, 3, 4)));
#endif
return p_result;
}
} // namespace Core
int main(int argc, char* argv[])
{
#ifdef USE_TR1
std::tr1::tuple test = Core::Demo();
#else
boost::tuple test = Core::Demo();
#endif
return 0;
}
---snip---
Error message is:
base class undefined
1> with
1> [
1> Tag=boost::fusion::non_fusion_tag
1> ]
1> and
1> [
1> Sequence=const Core::AutoConverter
1> ]
1> [...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp
(65) : see reference to class template instantiation
'boost::fusion::result_of::begin<Sequence>' being compiled
1> with
1> [
1> Sequence=const Core::AutoConverter
1> ]
1> [...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp
(105) : see reference to function template instantiation
'boost::fusion::vector_data4
boost::fusion::vector_data4::
init_from_sequence<Sequence>(const Sequence &)' being compiled
1> with
1> [
1> Derived=boost::fusion::vector4,
1> T0=int,
1> T1=int,
1> T2=int,
1> T3=int,
1> Sequence=Core::AutoConverter
1> ]
1> [...]\boost_1_36_0\boost\fusion\container\vector\vector.hpp(58) :
see reference to function template instantiation
'boost::fusion::vector4::vector4<T>(const Sequence &)'
being compiled
1> with
1> [
1> T0=int,
1> T1=int,
1> T2=int,
1> T3=int,
1> T=Core::AutoConverter,
1> Sequence=Core::AutoConverter
1> ]
1> [...]\boost_1_36_0\boost\fusion\tuple\tuple.hpp(33) :
see reference to function template instantiation
'boost::fusion::vector::
vector<Sequence>(const Sequence &)' being compiled
1> with
1> [
1> T0=int,
1> T1=int,
1> T2=int,
1> T3=int,
1> T4=boost::fusion::void_,
1> T5=boost::fusion::void_,
1> T6=boost::fusion::void_,
1> T7=boost::fusion::void_,
1> T8=boost::fusion::void_,
1> T9=boost::fusion::void_,
1> Sequence=Core::AutoConverter
1> ]
1> [MYPATH]\tr1tupleconversionproblem.cpp(69) :
see reference to function template instantiation
'boost::fusion::tuple::
tupleCore::AutoConverter(const Sequence &)' being compiled
1> with
1> [
1> T0=int,
1> T1=int,
1> T2=int,
1> T3=int,
1> T4=boost::fusion::void_,
1> T5=boost::fusion::void_,
1> T6=boost::fusion::void_,
1> T7=boost::fusion::void_,
1> T8=boost::fusion::void_,
1> T9=boost::fusion::void_,
1> Sequence=Core::AutoConverter
1> ]
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(65) :
error C2039: 'type' : is not a member of
'boost::fusion::result_of::begin<Sequence>'
1> with
1> [
1> Sequence=const Core::AutoConverter
1> ]
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(65) :
error C2146: syntax error : missing ';' before identifier 'I0'
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(65) :
error C4430: missing type specifier - int assumed.
Note: C++ does not support default-int
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(65) :
error C2065: 'I0' : undeclared identifier
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(66) :
error C2146: syntax error : missing ';' before identifier 'i0'
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(66) :
error C2065: 'i0' : undeclared identifier
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(66) :
error C2893: Failed to specialize function template
'const result_of::begin<const Sequence>::type
boost::fusion::begin(const Sequence &)'
1> With the following template arguments:
1> 'Core::AutoConverter'
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(66) :
error C2893: Failed to specialize function template
'const result_of::begin<Sequence>::type boost::fusion::begin(Sequence &)'
1> With the following template arguments:
1> 'const Core::AutoConverter'
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(67) :
error C2955: 'boost::fusion::result_of::next' :
use of class template requires template argument list
1> [...]\boost_1_36_0\boost\fusion\iterator\next.hpp(50) :
see declaration of 'boost::fusion::result_of::next'
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(67) :
error C2039: 'type' : is not a member of 'boost::fusion::result_of::next'
1> [...]\boost_1_36_0\boost\fusion\iterator\next.hpp(50) :
see declaration of 'boost::fusion::result_of::next'
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(67) :
error C2039: 'type' :
is not a member of 'boost::fusion::result_of::next<Iterator>'
1> with
1> [
1> Iterator=I1
1> ]
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(67) :
error C2893: Failed to specialize function template
'const result_of::next<Iterator>::type boost::fusion::next(const Iterator &)'
1> With the following template arguments:
1> 'I1'
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(67) :
error C2039: 'type' : is not a member of
'boost::fusion::result_of::next<Iterator>'
1> with
1> [
1> Iterator=I1
1> ]
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(67) :
error C2893: Failed to specialize function template
'const result_of::next<Iterator>::type boost::fusion::next(const Iterator &)'
1> With the following template arguments:
1> 'I2'
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(68) :
error C2100: illegal indirection
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(68) :
error C2100: illegal indirection
1>[...]\boost_1_36_0\boost\fusion\container\vector\detail\vector_n.hpp(68) :
error C2100: illegal indirection