Ich bin heute auf ein interessantes Problem gestoßen. Betrachten Sie dieses einfache Beispiel:
template <typename T>
void foo(const T & a) { /* code */ }
// This would also fail
// void foo(const int & a) { /* code */ }
class Bar
{
public:
static const int kConst = 1;
void func()
{
foo(kConst); // This is the important line
}
};
int main()
{
Bar b;
b.func();
}
Beim Kompilieren erhalte ich eine Fehlermeldung:
Undefined reference to 'Bar::kConst'
Ich bin mir ziemlich sicher, dass dies daran liegt, dass das static const int
nirgendwo definiert ist, was beabsichtigt ist, da der Compiler nach meinem Verständnis in der Lage sein sollte, das Ersetzen zur Kompilierungszeit vorzunehmen und keine Definition zu benötigen. Da die Funktion jedoch einen const int &
Parameter verwendet, scheint sie die Substitution nicht vorzunehmen und stattdessen eine Referenz zu bevorzugen. Ich kann dieses Problem beheben, indem ich folgende Änderung vornehme:
foo(static_cast<int>(kConst));
Ich glaube, dies zwingt den Compiler jetzt dazu, ein temporäres int zu erstellen und dann einen Verweis auf das zu übergeben, was er zur Kompilierungszeit erfolgreich ausführen kann.
Ich habe mich gefragt, ob dies beabsichtigt war oder erwarte ich zu viel von gcc, um diesen Fall behandeln zu können? Oder sollte ich das aus irgendeinem Grund nicht tun?
const int kConst = 1;
das gleiche Ergebnis erzielen. Es gibt auch selten einen Grund (ich kann mir keinen vorstellen), dass eine Funktion einen Parameter des Typs übernimmtconst int &
- verwenden Sie einfach einenint
hier.