Ambiguous injected class name is not an error

后端 未结 2 1294
甜味超标
甜味超标 2021-01-01 15:30

What I read in the C++ standard about injected class names contradicts (as I see it) with the behavior of a sample program I will present shortly. Here\'s what I read:

相关标签:
2条回答
  • 2021-01-01 15:45

    No, you are not missing anything, and your compiler seems to behave buggy. You can see how gcc handles it here: http://ideone.com/MI9gz

    Its error message is:

    prog.cpp:4:4: error: reference to 'vector' is ambiguous
    /usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error: candidates are: class std::vector<char> std::vector<char>::vector
    /usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error:                 class std::vector<int> std::vector<int>::vector
    
    0 讨论(0)
  • 2021-01-01 16:01

    I found it! It's right there in the standard! I was right! It should be ambiguous!

    Clause 14.6.1 Paragraph

    A lookup that finds an injected-class-name (10.2) can result in an ambiguity in certain cases (for example, if it is found in more than one base class). If all of the injected-class-names that are found refer to specializations of the same class template, and if the name is followed by a template-argument-list, the reference refers to the class template itself and not a specialization thereof, and is not ambiguous. [Example:

    template <class T> struct Base { };
    template <class T> struct Derived: Base<int>, Base<char> 
    { 
        typename Derived::Base b; // error: ambiguous typename 
        Derived::Base<double> d;  // OK 
    };
    

    —end example]

    Bottom line: This is yet another Microsoft compiler BUG. Disabling language extensions doesn't help either.

    0 讨论(0)
提交回复
热议问题