C ++: вложенный класс шаблонного класса

Рассмотрим следующий код:

template < typename T >
struct A
{
    struct B { };
};

template < typename T >
void f( typename A<T>::B ) { }

int main()
{
    A<int>::B x;
    f( x );         // fails for gcc-4.1.2
    f<int>( x );    // passes
    return 0;
}

Так что здесь gcc-4.1.2 требует аргумент шаблонаf быть явно указанным. Это соответствует стандарту? Исправлена ​​ли эта проблема в более новых версиях GCC? Как я могу избежать явного указанияint во время звонкаf?

Обновить: Вот обходной путь.

#include <boost/static_assert.hpp>
#include <boost/type_traits/is_same.hpp>

template < typename T >
struct A
{
    typedef T argument;
    struct B { typedef A outer; };
};

template < typename T >
void f( typename A<T>::B ) { }

template < typename Nested >
void g( Nested )
{   
    typedef typename Nested::outer::argument TT;
    BOOST_STATIC_ASSERT( (boost::is_same< typename A<TT>::B, Nested >::value) );
}

struct NN 
{
    typedef NN outer;
    typedef NN argument;
};

int main()
{
    A<int>::B x;
    NN y;
    g( x );  // Passes
    g( y );  // Fails as it should, note that this will pass if we remove the type check
    f( x );  // Fails as before

    return 0;
}

Тем не менее, я до сих пор не понимаю, зачем звонитьf( x ); является недействительным. Можете ли вы сослаться на какой-то пункт в стандарте, который говорит, что такой вызов должен быть недействительным? Можете привести пример, когда такой вызов неоднозначен?

Ответы на вопрос(4)

Ваш ответ на вопрос