Я обнаружил странный случай, когда некоторый код (ниже) не компилируется под 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
находится в автоматически генерируемом файле, создаваемом сторонним кодом.
Это ошибка в компиляторе?