http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55576

Antony Polukhin <antoshkka at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |UNCONFIRMED
         Resolution|INVALID                     |

--- Comment #3 from Antony Polukhin <antoshkka at gmail dot com> 2012-12-04 
07:12:12 UTC ---
(In reply to comment #1)
> I don't think this is a G++ bug, there are three problems with this code:
> 
> 1) You need to #include <new> to use placement new
> 2) factory::apply is non-const but the parameter 'f' is const

Fixed

> 3) f.template apply<T> finds the current instantiation, ::apply<T>, rather 
> than
> the member function you are trying to call, use f.FactoryT::template apply<T>
> instead

That is the point. `f.template apply<T>(address);` is accepted by some
compilers without `FactoryT::`

Fixed version:

struct factory {
 template <typename T>
 void * apply(void * address) const {
  return 0;
 }
};

template <typename T>
struct apply {
 template <typename FactoryT>
 void* operator()(FactoryT const& f, void * address) const {
  return f.template apply<T>(address); // error: invalid use of ‘struct
apply<T>’ why???
 }
};

int main() {
 int place;
 apply<int>()(factory(), &place);
 return 0;
}

Reply via email to