实例化点澄清

时间:2019-02-21 11:48:00

标签: c++ templates instantiation

请考虑以下来自https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/name_binding.htm的代码:

#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 ++中就是这种情况,因此很明显,文章措词不正确或我遗漏了一些东西。有人可以澄清一下吗?

1 个答案:

答案 0 :(得分:0)

好的,上面(point of instantiation and name binding)上的链接最终确实回答了这个问题,但是并不清楚。我发现this pagethis page进一步帮助了我的理解,因此我将其发布在这里,以便其他人可以受益。