【发布时间】:2026-02-05 04:45:02
【问题描述】:
如果一个普通函数调用一个尚未声明的函数,我会得到一个编译时错误:
void foo(int x)
{
bar(x); // ERROR: bar has not been declared yet
}
void bar(int x)
{
std::cout << x << '\n';
}
int main()
{
foo(42);
}
解决方法是前向声明被调用的函数,或者切换定义的顺序。
但是,对于函数模板,这些修复似乎不是必需的:
template<typename T>
void foo(T x)
{
bar(x); // OKAY
}
template<typename T>
void bar(T x)
{
std::cout << x << '\n';
}
int main()
{
foo(42);
}
这编译得很好。这是为什么?编译器看到bar(x),为什么不报错?
(我使用的是 g++ 4.6.3)
【问题讨论】:
-
gcc 4.8.1 在这里。不编译。
-
@sbabbi:有什么错误?它在 gcc 4.8.1 上对我来说编译得很好。
-
@J.N. “错误:在这个范围内没有声明‘bar’,并且在实例化点[-fpermissive]没有通过依赖于参数的查找找到任何声明”
-
您是否按原样复制样本?还是你改变了什么?
-
@J.N. “#include
”和复制粘贴。它也无法在 ideone 上编译。
标签: c++ function templates gcc forward-declaration