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

--- Comment #6 from Fernando Pelliccioni <fpelliccioni at gmail dot com> 
2012-05-05 22:01:23 UTC ---
// g++ -std=c++11 gcc_error_simple.cpp
// g++ -DWITH_USING_DECLARATION -std=c++11 gcc_error_simple.cpp

#include <iostream>
#include <type_traits>
#include <typeinfo>

template <typename T>
struct Base
{
    template <typename T2>
    typename std::enable_if<std::is_same<T, T2>::value, T>::type 
    get()
    {
    }
};

template <typename T>
struct Derived : Base<int>
{
    typedef Base<int> base;

#ifdef WITH_USING_DECLARATION
    using base::get;
#endif

    template <typename T2>
    typename std::enable_if<std::is_same<T, T2>::value, T>::type
    get()
    {
    }
};


int main( /* int argc, char* argv[] */ )
{
    Derived<double> d;

    auto xxx = d.get<double>();
    //std::cout << typeid(xxx).name() << std::endl;

    auto yyy = d.get<int>();        // #ifndef WITH_USING_DECLARATION ->
Compile-time error    -> GCC is behaving incorrectly. Base<int>::get<int>()
should not be hidden
                                                            // #ifdef 
WITH_USING_DECLARATION -> No Compile-time error -> GCC is behaving incorrectly.
Base<int>::get<int>() must be hidden.
    //std::cout << typeid(yyy).name() << std::endl;

    return 0;
}

Reply via email to