Dzisiaj natknąłem się na ciekawy problem. Rozważmy ten prosty przykład:
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();
}
Podczas kompilacji pojawia się błąd:
Undefined reference to 'Bar::kConst'
Teraz jestem prawie pewien, że dzieje się tak dlatego, że static const int
nigdzie nie jest zdefiniowany, co jest zamierzone, ponieważ zgodnie z moim zrozumieniem kompilator powinien być w stanie dokonać zamiany w czasie kompilacji i nie potrzebować definicji. Jednak ponieważ funkcja przyjmuje const int &
parametr, wydaje się, że nie dokonuje podstawienia, a zamiast tego preferuje odniesienie. Mogę rozwiązać ten problem, wprowadzając następującą zmianę:
foo(static_cast<int>(kConst));
Wydaje mi się, że teraz zmusza to kompilator do utworzenia tymczasowego int, a następnie przekazania do niego odniesienia, co może z powodzeniem wykonać w czasie kompilacji.
Zastanawiałem się, czy było to zamierzone, czy też oczekuję zbyt wiele od gcc, aby poradzić sobie z tym przypadkiem? A może jest to coś, czego z jakiegoś powodu nie powinienem robić?
const int kConst = 1;
ten sam wynik. Poza tym rzadko istnieje powód (nie przychodzi mi do głowy żaden), aby funkcja przyjmowała parametr typuconst int &
- po prostu użyjint
tutaj.