http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45114
--- Comment #10 from vincenzo Innocente <vincenzo.innocente at cern dot ch>
2011-10-31 16:06:41 UTC ---
using the patch of comment 8
in the example below I get
$ c++ -std=gnu++0x -c talias.cc
$ c++ -std=gnu++0x -c talias.cc -DALIAS
talias.cc: In instantiation of ‘Bar::D<T> Bar::d() [with T = int]’:
talias.cc:44:19: required from here
talias.cc:34:23: error: no matching function for call to
‘Bar::D<int>::D(Bar::A<int>)’
talias.cc:34:23: note: candidates are:
talias.cc:19:5: note: Bar::D<T>::D(const Bar::A<T>&) [with T = int; Bar::A<T> =
Foo<int>]
talias.cc:19:5: note: no known conversion for argument 1 from ‘Bar::A<int>
{aka Foo<int>}’ to ‘Bar::A<int>& {aka Foo<int>&}’
talias.cc:15:5: note: Bar::D<T>::D() [with T = int]
talias.cc:15:5: note: candidate expects 0 arguments, 1 provided
talias.cc:14:10: note: constexpr Bar::D<int>::D(const Bar::D<int>&)
talias.cc:14:10: note: no known conversion for argument 1 from ‘Bar::A<int>
{aka Foo<int>}’ to ‘const Bar::D<int>&’
talias.cc:14:10: note: constexpr Bar::D<int>::D(Bar::D<int>&&)
talias.cc:14:10: note: no known conversion for argument 1 from ‘Bar::A<int>
{aka Foo<int>}’ to ‘Bar::D<int>&&’
otherwise the patch looks fine (i.e. no other problem found so far :-)
template<typename T>
struct Foo {
explicit Foo(char *im) : m(im){}
char * m;
};
struct Bar {
template<typename T> using A = Foo<T>;
template<typename T>
struct D {
D() {}
#ifndef ALIAS
D(Foo<T> const & ia) : a(ia) {}
#else
D(A<T> const & ia) : a(ia) {}
#endif
A<T> a;
};
template<typename T>
A<T>
a() {
return A<T>(m_i);
}
template<typename T>
D<T> d() {
return D<T>(a<T>());
}
char m_i[10000];
};
Bar b;
Bar::D<int> bar() {
return b.d<int>();
}