【问题标题】:this->... required in template wrapper classes [duplicate]this->... 模板包装类中需要 [重复]
【发布时间】:2018-05-29 09:55:53
【问题描述】:

请帮我解释一下为什么在这种情况下我不能直接调用 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();

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

【问题讨论】:

  • 这是有趣的事情之一。在某处可能有一个副本。顺便说一句,我认为this-&gt;func1(); 是首选。
  • 感谢和抱歉重复

标签: c++ visual-c++


【解决方案1】:

func1() 不依赖于编译器在第一次遍历时不知道的任何内容,当它查看没有提供任何特定模板参数的模板代码时,它会尝试查找它可以查找的内容——a名为func1的全局函数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2016-12-01
    相关资源
    最近更新 更多