首页 > 解决方案 > this->... 在模板包装类中是必需的

问题描述

请帮我解释一下为什么在这种情况下我不能直接调用 func1() :

class A {
public:
    void func1() {}
};

template <typename wrapped_type>
class B : public wrapped_type {
public:
    void func2() {
        func1();
    }
};

B<A> b;

上面的代码在 func1() 调用中导致“error C3861: 'func1': identifier not found”。但是如果我用以下两个选项之一替换这个调用,那么它可以编译成功:

this->func1();

或者

wrapped_type::func1();

据我所知,模板类只有在确定所有类型参数后才能真正编译。

标签: c++visual-c++

解决方案


func1()不依赖于编译器在第一次通过时不知道的任何东西,当它在没有提供任何特定模板参数的情况下查看模板代码时,它会尝试查找它可以查找的内容——一个名为func1.

通过声明this->func1(),它告诉编译器它必须在类中查找,func1并且编译器知道在它有一个完全定义的类(包括模板化继承)之前它不能这样做,所以编译this->func1()被推迟到第二遍,当类型已完全实例化。

您可以wrapped_type在有 func1 的情况下传递 a,在这种情况下代码必须编译,或者您可以wrapped_typ在没有 func1 的情况下传递 a,在这种情况下代码不能编译,因此必须等待。


推荐阅读