Boost logo

Boost :

Subject: Re: [boost] [mpl] has_function
From: Jeffrey Hellrung (jhellrung_at_[hidden])
Date: 2010-03-27 22:55:50


Lorenzo Caminiti wrote:
> It turned out that I only needed to check if a struct is declared
> within one of the base classes or not. This seems simpler that my
> original goal for has_function and I was able to adapt Ingo's code to
> get the job done -- see below. However, I am getting the following
> compiler error:
>
> $ g++ -Wall -Werror test/noinherit/05.cpp
> test/noinherit/05.cpp: In instantiation of ‘const bool
> z::has_contract_f_<x>::value’:
> test/noinherit/05.cpp:34: instantiated from here
> test/noinherit/05.cpp:31: error: the default argument for parameter 1
> of ‘static char z::has_contract_f_<T>::check(C*, typename
> C::contract_f_<0>*) [with C = x, T = x]’ has not yet been parsed
>
> Do you know how I can get around this error?
>
> // File test/noinherit/05.cpp
>
> #include <iostream>
>
> struct x {
> virtual void f() {}
> template<int Z> struct contract_f_ {};
> };
>
> struct y {
> void g() {}
> template<int Z> struct contract_g_ {};
> };
>
> struct z: x, y {
> void f() {}
> template<int Z> struct contract_f_ {};
>
> template<typename T>
> struct has_contract_f_ {
> private:
> typedef char true_t;
> struct false_t { true_t dummy[2]; };
> static T* make();
>
> static false_t check(...);
> template<typename C> static true_t check(C*,
> typename C::template contract_f_<0>* = 0);
> public:
> static const bool value =
> sizeof(check(make())) == sizeof(true_t); // line 31
> };
>
> static const bool bx = has_contract_f_<x>::value; // line 34
> static const bool by = has_contract_f_<y>::value;
> };
>
> int main() {
> std::cout << z::bx << std::endl;
> std::cout << z::by << std::endl;
> return 0;
> }
>
> If has_contract_f_ is declared outside struct z than there is no error
> -- the code compiles and works. However, I need has_contract_f_ to be
> a member struct of z, because of the way I use it within my library,
> and that generates the compiler error reported above.
>
> Thanks a lot.
> Lorenzo

Compiles fine for me (MSVC9, Vista).

- Jeff


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk