我有一个关于模板实例化的问题。我认为模板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
答案 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
,或者可能完全不同地声明它。
您可以通过编写test
或test
来使this->test();
成为从属名称,然后该示例将进行编译。