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

标签 c++ templates

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

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依赖,所以它是非依赖的并立即查找。 testBase<T>由于 Base 的特化而无法找到可能没有成员 test ,或者可能会完全不同地声明它。

您可以制作test家属姓名,写作 this->test();Base<T>::test();相反,然后该示例将编译。

关于c++ - 模板隐式实例化发生在使用之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34603845/

相关文章:

c++ - 使用共享指针调用遗留函数

c++ - 汉诺塔与类

c++ - 模糊的 C++ 编译错误

c++ - 使用模板将堆栈实现为链表时出现 "symbols not found"错误

php - 如何将参数传递给使用 'include' 呈现的 PHP 模板?

c++ - 为什么 C++ 标准不区分右值引用和转发引用?

c# - 如何从 C# 调用此 native 方法

c++ - 如何将 5(或零?)规则正确应用于包含带有字符串的自定义对象 vector 的类

c++ - 进一步的 std::set 问题

C++ 模板 - 几个特化 - 是否定义了行为?