오늘 흥미로운 문제가 발생했습니다. 이 간단한 예를 고려하십시오.
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하십시오.