Warum kompiliert diese private Vorlagenfunktion? -> Compiler -Fehler gegen 2009
-
26-10-2019 - |
Frage
Dies kompiliert ohne Probleme in VS 2009? Bin ich dumm? GCC warnt, dass die Vorlage privat ist ....? Was vermisse ich?
#include <iostream>
using namespace std;
class A
{
private:
template<typename T>
A& operator<<(const T & v)
{
cout << v << endl;
return *this;
}
};
int main()
{
A a;
a << 4;
system("pause");
}
Lösung
Dieser Code sollte nicht kompilieren - dies ist ein Fehler (oder eine alberne Erweiterung) in Vs. GCC sollte es auch ablehnen. Der Bediener ist in dem von ihm verwendeten Bereich unzugänglich.
Comeau behandelt dies richtig:
"ComeauTest.c", line 28: error: function "A::operator<<(const T &) [with T=int]"
(declared at line 14) is inaccessible
a << 4;
Bearbeiten: Ein relevantes Standardausschnitt von 13.3/1
Hinweis: Die durch Überlastauflösung ausgewählte Funktion ist für den Kontext nicht garantiert. Andere Einschränkungen, wie die Zugänglichkeit der Funktion, können ihre Verwendung im aufrufenden Kontext schlecht geformt machen.
Andere Tipps
Microsoft bestätigt den Fehler und behauptet, er werde in der nächsten großen Version für den Compiler behoben (was ich als VC11/VS-What-Is-After-2010 gelesen habe-wahrscheinlich kein Servicepaket für VC10/VS2010):
Aus den Kommentaren scheint das Fix an einem internen Compiler -Build bereits vorgenommen zu werden.
Nein, du bist nicht dumm - es ist defekter Code und sollte abgelehnt werden. Der Comeau -Compiler (http://www.comoucomputing.com/tryitout) lehnt es richtig ab.