
Bronek Kozicki wrote:
Daniel Frey <d.frey@gmx.de> wrote: [...]
I tried following code:
#include <iostream> template <typename T> class V {}; template <template <typename> class T> struct B {}; struct D : B<V> {}; template <typename T> void f (const B<T>&) { std::cout << typeid(T).name() << std::endl; } int main() { D d; f (d); }
According to Comeau compiler and GCC this program is invalid. I have
Yes, the code is invalid. The correct code (used in the constant library) looks like this: template<template <typename> class T> void f( const B<T>& ) {} T is than deduced to V. V is not a valid class on itself, it's just a valid template for a template template parameter. However:
.... however it compiles under VC71, and the output of this program is: class V
I think that's a surprise?
Nope. My skills in guessing VC-bugs just seem to get better every day :) Could you ask on some MS-support-groups about this, please? I think it's wrong to compile the code and deduce T to V, as V is not a class. The MS-folks should please either confirm the bug or kindly point me to the standard text that allows this behaviour. Regards, Daniel