【问题标题】:C++ Can't access parent method from derived template specialization despite public access尽管有公共访问权限,但 C++ 无法从派生模板特化中访问父方法
【发布时间】:2021-07-19 13:33:33
【问题描述】:

我正在尝试从派生模板类访问父方法,但尽管在任何地方都使用公共访问,并且“this->”是安全的,但我收到了错误。

error: 'class Derived<TagTypeA, int>' has no member named 'insert'

我不知道我是否在某个地方犯了一个愚蠢的错误,但我无法弄清楚为什么 Derived 类无法访问父类的东西。

我的代码如下所示,也在这里:https://godbolt.org/z/nMbe4fMnM

#include <bits/stdc++.h>

struct TagTypeA;

template<typename T>
class Base {
  public:
    std::set<T> data;
    void insert(const T& v) { data.insert(v); }
    void erase(const T& v) { data.erase(v); }
};

template<typename Tag, typename T>
class Derived : public Base<T> {};

// specialization of Derived
template<typename T>
class Derived<TagTypeA, T> {
  public:
    void call_parent_insert(const T& v) { this->insert(v); }
};

int main() 
{ 
    Derived<TagTypeA, int> foo;
    foo.call_parent_insert(1);
}

【问题讨论】:

  • Derived&lt;TagTypeA, T&gt; 没有基类?
  • 但它是 Derived 的特化,它以 Base 作为其基类
  • 专业基本上是独立的类,和原来的类没有关系
  • 哦,我不知道。我想是因为你不能有一个没有非专业版本的专业类,它会以某种方式知道继承,但我猜不是。无论如何,写class Derived&lt;TagTypeA, T&gt; : public Base&lt;T&gt; 解决了这个问题。谢谢!

标签: c++ oop templates inheritance


【解决方案1】:

编译器需要一个可疑的基类来包含有问题的方法,以便认为代码合法。

模板特化描述的类

template<typename T>
class Derived<TagTypeA, T> {
  public:
    void call_parent_insert(const T& v) { this->insert(v); }
};

声明Derived&lt;TagTypeA ,T&gt; 类型没有基类。它无法从任何地方获取insert 方法。声明应该是这样的

template<typename T>
class Derived<TagTypeA, T> : public Base<T> {

在此声明时,insert 没有必要在 Base&lt;T&gt; 中定义。稍后可能会在Base 的特化中定义它。这仅在 Derived 的实例化点很重要,因为您巧妙地使用了 this-&gt;insert 表达式。

如果一个非特化的Derived 永远不会被使用,它可以被声明为不完整的类。在这种情况下,它的唯一目的是声明模板的存在,并且在这种情况下,在误用的情况下减少神秘模板错误的数量。

template<typename Tag, typename T> class Derived;

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 1970-01-01
    • 2015-09-13
    • 2018-01-18
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多