Der Code gibt, ist die folgende:Visual C++ Compiler falsche Zeilenreferenz für mehrdeutiges Symbol
namespace n1
{
template <class T>
void n2();
template <class T>
void n2(T);
}
namespace n2 /* line 12 */
{
class c {};
}
using namespace n1;
namespace n3
{
void foo(n2::c);
}
void n3::foo(n2::c) /* line 24 */
{
}
Beim Versuch, es zu kompilieren die neueste Version von Visual C++ Ich erhalte die folgenden Fehler:
1>test.cpp(24): error C2872: 'n2': ambiguous symbol
1>test.cpp(12): note: could be 'n2'
1>test.cpp(24): note: or 'n2'
Die Zeilen 12 und 24 sind im vorherigen Codeteil mit Kommentaren markiert.
Was geht hier vor? Wenn ich die Definition von foo entferne und eine Variable vom Typ n2 :: c außerhalb einer Funktionsargumentliste deklariere, kompiliert es einfach gut. Ich nehme an, weil der Compiler herausfindet, dass ich auf die Klasse und nicht auf irgendeine der Template-Funktionen referenziere . Wenn ich stattdessen die zweite Definition der beiden n2-Template-Funktionen im Namespace n1 lösche, gibt der Compiler mir eine Fehlermeldung, verweist aber auf die richtigen Zeilen: Zeile 12 und die Zeile, wo n2 als Funktion definiert ist (statt Zeile 24)). Ist das ein Compilerfehler?
ich diesen Code mit verschiedenen Compilern getestet haben: VC++ 2015 nicht kompilieren und gibt falsche Zeilennummern aus. VC++ 2012 und 2013 kompilieren nicht, geben jedoch keine Zeilennummern aus (für die Kandidaten). gcc (verschiedene Versionen) kompilieren. - Die Zeilennummern sind eindeutig fehlerhaft (scheint ein neues Feature in VC++ 2015 zu sein), aber ich bin nicht in der Lage zu sagen, ob dieser Code kompilieren sollte oder nicht. –
Niemand hier kann das für dich ändern. Melden Sie Fehler und unerwünschtes Compilerverhalten auf connect.microsoft.com –