模板隐式实例化在使用之前发生

时间:2016-01-05 03:47:59

标签: c++ templates

我有一个关于模板实例化的问题。我认为模板imlicit instantiation在需要时发生。让我们看看下面的例子:

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

1 个答案:

答案 0 :(得分:4)

首次解析模板时,定义中的所有名称都是&#34;依赖&#34;姓名或&#34;非依赖&#34;名。非依赖名称​​必须匹配先前在模板定义之前声明的内容。在为特定实例化知道模板参数之前,不会查找从属名称。这被称为&#34;两阶段查找&#34;。

在您的示例中,<link rel="shortcut icon" href="http://www.example.com/myicon.ico" /> <link rel="icon" type="image/vnd.microsoft.icon" href="http://example.com/image.ico" /> <link rel="icon" type="image/png" href="http://example.com/image.png" /> <link rel="icon" type="image/gif" href="http://example.com/image.gif" /> 无法使test();依赖,因此它不依赖并立即查找。无法找到test中的test,因为Base<T>的特化可能没有成员Base,或者可能完全不同地声明它。

您可以通过编写testtest来使this->test();成为从属名称,然后该示例将进行编译。