VS2008(+?) ошибка компилятора с шаблонированными функциями и 'using namespace'

Я обнаружил странный случай, когда некоторый код (ниже) не компилируется под Visual Studio 2008 и выдает "error C2872: 'Ambiguity' : ambiguous symbol" на строке 12.

Удаление using namespace RequiredNamespace в последней строке исправляет ошибку, но я ожидал, что размещение using namespace в конце файла не должно иметь никакого эффекта. Это также зависит от того, что AnotherFunction является шаблонной функцией, поэтому я предполагаю, что компилятор генерирует шаблонные функции в неправильной области видимости или не сбрасывает список используемых пространств имен перед этим.

Тот же код компилируется в GCC.

Оба компилятора, похоже, генерируют код для TemplatedFunction после определения using namespace Namespace, по крайней мере, насколько я могу судить, вводя ошибки и глядя на порядок их вывода.

namespace Ambiguity
{
    class cSomeClass
    {
    };

    template<class T>
    void TemplatedFunction(T a)
    {
        // this is where the error occurs, the compiler thinks Ambiguity
        // might refer to the class in RequiredNamespace below
        Ambiguity::cSomeClass(); 
    }
}

namespace RequiredNamespace 
{
    // without a namespace around this class, the Ambiguity class 
    // and namespace collide
    class Ambiguity
    {
    };
}

int main()
{
    // to force the templated function to be generated
    Ambiguity::TemplatedFunction(4); 
}

// removing this removes the error, but it shouldn't really do anything
using namespace RequiredNamespace; 

Очевидно, что это изготовленный пример, но оригинал взят из реального случая, где using namespace находится в автоматически генерируемом файле, создаваемом сторонним кодом.

Это ошибка в компиляторе?

5
задан eAi 14 September 2010 в 16:20
поделиться