Boost logo

Boost Users :

Subject: [Boost-users] Can not compile a program that uses typeof package by gcc?
From: Peng Yu (pengyu.ut_at_[hidden])
Date: 2008-10-20 11:39:16


Hi,

The program below this email does not compile with gcc 4.1.2.

g++ (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

I understand that I should ask on the gcc mailing list first, as gcc
says it is own bug. But I want to make sure it is not become the
typeof package uses some too advanced compiler features. Can somebody
let me know if the following code can be compiled by a more recent
version of gcc or some other compiler?

Thanks,
Peng

#include <boost/typeof/typeof.hpp>
#include <iostream>

namespace A {

  template <typename T>
    class X {
      public:
        X() { }
        X(T t) : _t(t) { }
        const T &the_t() const { return _t; }
      private:
        T _t;
    };

  template <typename T1, typename T2>
    struct multiply_traits;

  template <typename T1, typename T2>
    struct multiply_traits<X<T1>, T2> {
      typedef X<T1> result_type;
    };

  template <typename T1, typename T2>
    typename multiply_traits<X<T1>, T2>::result_type operator*(const
X<T1> &x, const T2 &t) {
      return X<T1>(x.the_t() * t);
    }

}

namespace B {

  template <typename T>
    class Y {
      public:
        Y(T t) : _t(t) { }
        const T &the_t() const { return _t; }
      private:
        T _t;
    };

  template <typename T1, typename T2>
    //Y<typename multiply_traits<T1, T2>::result_type> operator*(const
Y<T1> &y, const T2 &t) {
    //Y<T1> operator*(const Y<T1> &y, const T2 &t) {
    Y<BOOST_TYPEOF(T1() * T2())> operator*(const Y<T1> &y, const T2 &t) {
      return Y<T1>(y.the_t() * t);
    }
}

int main () {

  A::X<int> x(2);
  B::Y<A::X<int> > y(x);

  std::cout << (x * 3).the_t() << std::endl;
  std::cout << (y * 5).the_t().the_t() << std::endl;

}


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net