Сегодня я столкнулся с интересной проблемой. Рассмотрим этот простой пример:
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();
}
При компиляции я получаю сообщение об ошибке:
Undefined reference to 'Bar::kConst'
Теперь я уверен, что это связано с тем, что static const int
не определен нигде, что является преднамеренным, потому что, согласно моему пониманию, компилятор должен иметь возможность выполнять замену во время компиляции и не нуждаться в определении. Однако, поскольку функция принимает параметр const int &
, кажется, что она не делает замену и вместо этого предпочитает ссылку. Я могу решить эту проблему, внеся следующие изменения:
foo(static_cast<int>(kConst));
Я считаю, что теперь это вынуждает компилятор сделать временный int, а затем передать ссылку на это, что он может успешно выполнить во время компиляции.
Мне было интересно, было ли это намеренно, или я ожидаю слишком многого от gcc, чтобы иметь возможность справиться с этим делом? Или это почему-то я не должен делать по какой-то причине?