请帮我解释为什么在这种情况下我无法直接调用func1():
class A {
public:
void func1() {}
};
template <typename wrapped_type>
class B : public wrapped_type {
public:
void func2() {
func1();
}
};
B<A> b;
以上代码导致&#34;错误C3861:&#39; func1&#39;:未找到标识符&#34;在func1()调用。但是如果我用以下两个选项之一替换这个调用,那么它可以成功编译:
this->func1();
或
wrapped_type::func1();
根据我所学到的,只有在确定所有类型参数后才能真正编译模板类。
答案 0 :(得分:1)
func1()
不依赖于编译器在查看模板代码时没有提供任何特定模板参数时第一次通过时所知的任何内容,因此它会尝试查找它能做什么 - 一个名为func1
的全局函数。
通过声明this->func1()
,它告诉编译器它必须在func1
的类中查找,并且编译器知道在它具有完全定义的类(包括模板化继承)之前它不能这样做,所以this->func1()
的编译推迟到第二遍,当类型完全实例化时。
你可以传递一个wrapped_type
,其中有一个func1,在这种情况下代码必须编译,或者你可以在没有func1的情况下传递wrapped_typ
,在这种情况下代码不能编译,所以它必须等待。