【发布时间】:2011-07-20 12:04:30
【问题描述】:
我今天遇到了一个有趣的问题。考虑这个简单的例子:
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。 -
@Space 真正的功能是一个模板,我会编辑我的问题来提一下。
-
@Space 仅供参考,不让它
static给出错误`ISO C++ 禁止初始化成员'kConst'...使'kConst' 成为静态。' -
我的错,谢谢指正。
-
烦人的是,这个错误可能会出现在像
std::min( some_val, kConst)这样的无害用法中,因为std::min<T>有T const &类型的参数,这意味着我们需要传递一个引用到 kConst。我发现它仅在优化关闭时发生。使用静态转换修复。