Ich habe festgestellt, dass dieser seltsame Fall von etwas Code (unten) unter Visual Studio 2008 nicht kompiliert und einen "Fehler C2872: Ambiguity" erzeugt: mehrdeutiges Symbol“auf der Leitung 12.VS2008 (+?) Compiler-Fehler mit Vorlagenfunktionen und 'using namespace'
die mit namespace RequiredNamespace
in der letzten Zeile behebt den Fehler entfernen, aber ich würde erwarten, dass using namespace
am Ende einer Datei setzen sollte keine Auswirkung. Es stützt sich auch auf AnotherFunction
ist eine Vorlage-Funktion, so erwarte ich, dass der Compiler die Vorlagenfunktionen im falschen Bereich generiert, oder die Liste der Namespaces nicht zurückgesetzt wird, die zuvor verwendet wird.
Der gleiche Code kompiliert unter GCC.
Beide Compiler scheinen den Code für TemplatedFunction
nach der using namespace Namespace
Definition zu generieren, zumindest so weit ich kann sagen, indem Fehler eingeführt und auf die Reihenfolge, die sie ausgegeben werden.
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;
Offensichtlich ist dies ein hergestelltes Beispiel, aber das Original aus einem realen Fall extrahiert wird, wo die using namespace
in einer automatisch generierten Datei von 3rd-Party-Code erzeugt wird.
Ist das ein Fehler im Compiler?
ist es mir oder ist das ein wirklich schwer zu lesendes Beispiel, mit diesen bestimmten Bezeichnern? –
Preet - es ist nicht nur du. –
Wie kann ich es einfacher machen?Ich nehme an, dass ein Teil des Problems darin besteht, dass das Problem nicht auftritt, wenn Benennungskonventionen befolgt werden - wenn Sie beispielsweise Ihren Klassen c vorangestellt hätten, hätten Sie keine Klasse namens Ambiguity. Ich habe es ein wenig optimiert. – eAi