神秘的“这个”g++ 要求 [重复]

Mysterious "this" g++ requirement [duplicate]

提问人:acalabash 提问时间:6/7/2022 更新时间:6/7/2022 访问量:50

问:

如果创建模板类(或结构),然后从中继承定义类(结构),则可以使用以下代码:

template <typename T>
struct Par
{
    T t;
};

struct Chl : public Par<int>
{
    void setT(int in) { t = in; }
};

int main()
{
    Chl c;
    c.setT(1);
}

但是,如果你也制作一个模板,就像这样Chl

template <typename U>
struct Chl : public Par<U>
{
    void setT(U in) { t = in; }
};

int main()
{
    Chl<int> c;
    c.setT(1);
}

编译器会给你一个错误:

error: ‘t’ was not declared in this scope
   12 |  void setT(U in) { t = in; }

为了避免这种情况,您必须按如下方式定义 setT:

void setT(U in) { this->t = in; }

只有这样,它才会编译。

因此,看起来模板化会产生一些额外的歧义,必须通过 来解决,但事实似乎并非如此(因为基本结构在所有情况下都具有相同的单个字段)。那么为什么有必要(至少在 g++ 中)呢?Chlthistthis

C++ 模板 继承 这个

评论

1赞 Drew Dormann 6/7/2022
模板类可以是专用的。因此,编译器无法知道对于每个可能的基类的手段。tthis->tPar<U>

答: 暂无答案