c++ - 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();
据我所知,模板类只有在确定所有类型参数后才能真正编译。
解决方案
func1()
不依赖于编译器在第一次通过时不知道的任何东西,当它在没有提供任何特定模板参数的情况下查看模板代码时,它会尝试查找它可以查找的内容——一个名为func1
.
通过声明this->func1()
,它告诉编译器它必须在类中查找,func1
并且编译器知道在它有一个完全定义的类(包括模板化继承)之前它不能这样做,所以编译this->func1()
被推迟到第二遍,当类型已完全实例化。
您可以wrapped_type
在有 func1 的情况下传递 a,在这种情况下代码必须编译,或者您可以wrapped_typ
在没有 func1 的情况下传递 a,在这种情况下代码不能编译,因此必须等待。
推荐阅读
- jenkins - 将 jenkins 与 GoCD 集成
- javascript - 如何优化 useReducer 中对象数组的更新?
- python - 'TikTokApi' 对象没有属性'region'
- javascript - 跟进:我有 2 个单选按钮,我想将不同的 ajax 页面加载到 div 元素中,具体取决于选择哪个
- python - 在不使用熊猫的情况下逐行读取后清理文本文件数据
- salesforce - 限制休假用户的访问
- heroku - 如何在两个 Heroku 域之间设置 cookie?
- c++ - 将指向部分构造对象的指针转换为指向基类的指针是否合法?
- google-sheets - 将 Google 电子表格中的联系人添加到 Google 通讯录时出错
- android - 如何使用翻译动画移动图像?(将图像从一个位置移动到另一个位置)