Я сегодня столкнулся с интересной проблемой. Рассмотрим этот простой пример:
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, чтобы справиться с этим случаем? Или мне почему-то не следует этого делать?
const int kConst = 1;
того же результата. Кроме того, редко есть причина (я не могу придумать ни одной), чтобы функция принимала параметр типаconst int &
- просто используйтеint
здесь.