$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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