#include <iostream>
using namespace std;
void f(double) { cout << "Function f(double)" << endl; }
template <class A> struct container{ // point of definition of container
void member1(){
// This call is not template dependent,
// because it does not make any use of a template parameter.
// The name is resolved at the point of definition, so f(int) is not visible.
f(1);
}
void member2(A arg);
};
void f(int) { cout << "Function f(int)" << endl; }
void h(double) { cout << "Function h(double)" << endl; }
template <class A> void container<A>::member2(A arg){
// This call is template dependent, so qualified name lookup only finds
// names visible at the point of instantiation.
::h(arg);
}
template struct container<int>; // point of instantiation of container<int>
void h(int) { cout << "Function h(int)" << endl; }
int main(void){
container<int> test;
test.member1();
test.member2(10);
return 0;
}
输出为
Function f(double)
Function h(double)
我理解这一点,但是当文章指出时我不理解
模板的实例化点位于紧接之前 包含其用法的声明。在这个例子中, 容器的实例化是显式的位置 实例化
...这就是为什么当我将void h(int)
的定义移动到上方时,h(int)
仍然没有 >被叫。仅当我在功能定义上方将其移动 void container<A>::member2(A)
时才会调用它。
在VS2017和g ++中就是这种情况,因此很明显,文章措词不正确或我遗漏了一些东西。有人可以澄清一下吗?
答案 0 :(得分:0)
好的,上面(point of instantiation and name binding)上的链接最终确实回答了这个问题,但是并不清楚。我发现this page和this page进一步帮助了我的理解,因此我将其发布在这里,以便其他人可以受益。