Implicit Convert from own Typ to Boost::Variant Type

Hi, i'm new here and i hope you can help me. My problem i have a class with a Boost Variant type as member and a implicit convert operator from my class to this Variant type. But when i want use the conversion in my programm the Compiler give me a error. Compiler Version gcc 4.4.1 on Ubuntu system Boost version 1.45 Example Program: #include <iostream> #include <boost/variant.hpp> #include <boost/lexical_cast.hpp> using namespace std; typedef boost::variant<float,int> Testtyp; class Testtypcontainer { public: Testtypcontainer():m_testtyp((float) 5.5){} Testtyp m_testtyp; template<class T> void settesttyp(T testvalue){m_testtyp =testvalue;} Testtyp gettesttyp(){return m_testtyp;} operator Testtyp() const{ return m_testtyp; } }; int main(){ Testtyp help1; Testtypcontainer help3; cout<<help3.gettesttyp()<<endl; help1=(Testtyp)help3; // generate compile error return 0; } P.s. Sorry for my bad english

On 2/10/2011 11:44 PM, a.mueller wrote:
Hi, i'm new here and i hope you can help me. My problem i have a class with a Boost Variant type as member and a implicit convert operator from my class to this Variant type. But when i want use the conversion in my programm the Compiler give me a error. Compiler Version gcc 4.4.1 on Ubuntu system Boost version 1.45 Example Program: #include<iostream>
#include<boost/variant.hpp>
#include<boost/lexical_cast.hpp>
using namespace std;
typedef boost::variant<float,int> Testtyp;
class Testtypcontainer
{
public:
Testtypcontainer():m_testtyp((float) 5.5){}
Testtyp m_testtyp;
template<class T>
void settesttyp(T testvalue){m_testtyp =testvalue;}
Testtyp gettesttyp(){return m_testtyp;}
operator Testtyp() const{
return m_testtyp;
}
};
int main(){
Testtyp help1;
Testtypcontainer help3;
cout<<help3.gettesttyp()<<endl;
help1=(Testtyp)help3; // generate compile error
return 0;
}
P.s. Sorry for my bad english
Looks like the compiler translates your C-style cast help1=(Testtyp)help3; into a call to the constructor template< class T > variant< float, int >::variant(T&) rather than using Testtypcontainer's conversion operator. This could probably be fixed by SFINAE'ing out certain bindings of T in the variant constructor, i.e., using boost::enable_if to only allow T to be bound such that T& (and const T& for the other constructor overload) is (uniquely?) convertible to one of the variant's types (in this case, float and int). I would file a trac ticket, maybe simplify your example code: #include <boost/variant.hpp> typedef boost::variant<int> variant_t; struct X { operator variant_t() const { return variant_t(); } }; void main() { X x; variant_t v = static_cast< variant_t >(x); // COMPILER ERROR } and, if you wish and are able to, submit a patch. - Jeff

Ok thank you for your response I shall do so. ----- Original Message ----- From: "Jeffrey Lee Hellrung, Jr." <jhellrung@ucla.edu> To: <boost@lists.boost.org> Sent: Friday, February 11, 2011 8:30 PM Subject: Re: [boost] Implicit Convert from own Typ to Boost::Variant Type
On 2/10/2011 11:44 PM, a.mueller wrote:
Hi, i'm new here and i hope you can help me. My problem i have a class with a Boost Variant type as member and a implicit convert operator from my class to this Variant type. But when i want use the conversion in my programm the Compiler give me a error. Compiler Version gcc 4.4.1 on Ubuntu system Boost version 1.45 Example Program: #include<iostream>
#include<boost/variant.hpp>
#include<boost/lexical_cast.hpp>
using namespace std;
typedef boost::variant<float,int> Testtyp;
class Testtypcontainer
{
public:
Testtypcontainer():m_testtyp((float) 5.5){}
Testtyp m_testtyp;
template<class T>
void settesttyp(T testvalue){m_testtyp =testvalue;}
Testtyp gettesttyp(){return m_testtyp;}
operator Testtyp() const{
return m_testtyp;
}
};
int main(){
Testtyp help1;
Testtypcontainer help3;
cout<<help3.gettesttyp()<<endl;
help1=(Testtyp)help3; // generate compile error
return 0;
}
P.s. Sorry for my bad english
Looks like the compiler translates your C-style cast
help1=(Testtyp)help3;
into a call to the constructor
template< class T > variant< float, int >::variant(T&)
rather than using Testtypcontainer's conversion operator. This could probably be fixed by SFINAE'ing out certain bindings of T in the variant constructor, i.e., using boost::enable_if to only allow T to be bound such that T& (and const T& for the other constructor overload) is (uniquely?) convertible to one of the variant's types (in this case, float and int).
I would file a trac ticket, maybe simplify your example code:
#include <boost/variant.hpp>
typedef boost::variant<int> variant_t;
struct X { operator variant_t() const { return variant_t(); } };
void main() { X x; variant_t v = static_cast< variant_t >(x); // COMPILER ERROR }
and, if you wish and are able to, submit a patch.
- Jeff _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
participants (2)
-
a.mueller
-
Jeffrey Lee Hellrung, Jr.