我编写了这段代码来理解template
名称查找:
//void bar(int);
template <typename T>
void foo(T x)
{
bar(x);
}
void bar(int x)
{
std::cout << "bar(int)\n";
}
template <int>
void foo(int i)
{
bar(i);
}
int main()
{
foo<int>(4);
std::cout << "\ndone!\n";
}
我bar(int)
故意注释掉了函数的声明。此函数bar(int)
用作dependent name
模板函数中的一个foo
。所以它受实例化的约束。
- 我已经在专业化
bar
之后foo
和之前进行了定义,foo<int>
以便后者可以看到bar(int)
.
但是当我编译代码时,我得到了这个错误:
‘bar’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]|
. 如果我取消注释bar(int)
它的声明工作正常?!
如果我必须在模板中将其用作从属名称之前声明一个名称,那么为什么 C++ 允许在未实例化的情况下使用它。(如果我不“使用”模板化函数,代码是否有效
foo
)?template <typename U> void do_it(U u) { print(u); // not bound until instantiation }
那么允许调用尚未声明并且在实例化时会失败print(u)
的想法是什么?do_it