我有一个关于模板实例化的问题。我认为模板隐式实例化会在需要时发生。让我们看下面的例子:
template<typename T>
struct Base{
void test();
};
template <typename T> void Base<T>::test(){ }
template<typename T>
struct Derived : Base<T>{
void derived();
};
template <typename T> void Derived<T>::derived(){ test(); }
http://coliru.stacked-crooked.com/a/8c6ab39de2f8e701
此代码无法编译。我认为只有在显式或隐式实例化时才应该检查 test
的存在,如下例所示:
template<typename T>
struct Derived{
void derived();
};
template <typename T> void Derived<T>::derived(){ T::test(); } //fine
最佳答案
首次解析模板时,定义中的所有名称要么是“从属”名称,要么是“非从属”名称。非依赖名称必须与模板定义点之前先前声明的内容相匹配。在知道特定实例化的模板参数之前,不会查找依赖名称。这称为“两阶段查找”。
在您的示例中,test();
没什么可做的test
依赖,所以它是非依赖的并立即查找。 test
在Base<T>
由于 Base
的特化而无法找到可能没有成员 test
,或者可能会完全不同地声明它。
您可以制作test
家属姓名,写作 this->test();
或Base<T>::test();
相反,然后该示例将编译。
关于c++ - 模板隐式实例化发生在使用之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34603845/