c++ - this->... 在模板包装器类中需要

标签 c++ visual-c++

<分区>

请帮我解释一下为什么我不能在这种情况下直接调用 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() 的编译被推迟到第二遍,当类型被完全实例化时。

您可以在有 func1 的地方传递一个 wrapped_type,在这种情况下代码必须编译,或者您可以在没有 func1 的地方传递一个 wrapped_typ,在这种情况下如果代码不能编译,则必须等待。

关于c++ - this->... 在模板包装器类中需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50581424/

相关文章:

c++ - 如何确保 std::map 已订购?

.net - 警告 MSB8004 : Output Directory does not end with a trailing slash.

c++ - 在 Visual C++ 2005 中开发的 Visual C++ 项目 - 在 Visual C++ 2010 中,打开菜单时调试断言失败,但 Release模式有效,如何解决?

c++ - 有没有我可以直接获取地址的右值?

c++ - Visual Studio 11(测试版)中的强类型枚举类

c++ - 基于坐标和高度的日出和日落时间

c++ - 如何修复我的指针和数组函数中 Unresolved external 错误 - LNK2019 和 LNK1120

c++ - 如何在 C++ 中将 CString 转换为 char?

c++类型写特殊字符效果

c++ - 数组 (C++) : why use pointers over direct manipulation?