------- Comment #9 from bangerth at dealii dot org 2006-11-09 05:33 -------
PR29767 made me try whether we can achieve the same wrong effect for
template type parameters, and indeed we can:
--------------------
template <typename T> struct outer {
template <typename T2, typename U>
struct inner {
static int f() { return inner<T,int>::N; };
};
template <typename U>
struct inner<T,U> {
static const int N = 1;
};
};
int i = outer<int>::inner<double,int>::f();
------------------
This compiles with icc, but doesn't with gcc:
g/x> /home/bangerth/bin/gcc-4.2-pre/bin/c++ -c x.cc
x.cc: In static member function ‘static int outer<T>::inner<T2, U>::f()
[with T2 = double, U = int, T = int]’:
x.cc:13: instantiated from here
x.cc:4: error: ‘N’ is not a member of ‘outer<int>::inner<int,
int>’
As PR29767 shows, this can actually lead to wrong code.
W.
--
bangerth at dealii dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Summary|non type boolean template |Specialization of inner
|argument partial |template using outer
|specialization to argument |template argument doesn't
|in parent never matches |work
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14032