【问题标题】:Inheriting partially specialised template class from another partially specialised template class [duplicate]从另一个部分特化的模板类继承部分特化的模板类[重复]
【发布时间】:2018-03-05 11:04:17
【问题描述】:

我正在尝试从另一个部分专业化的模板类继承一个部分专业化的模板类。如果有人能解释是什么问题,我真的很感激。

例子:

template<typename T, typename U>
class Base
{
public:
    int i;
    Base(int _i) : i{_i}
    {}
};

template<typename T, typename U>
class Derived: public Base<T, U>
{
public:
    Derived(int _i) :Base<T, U>{_i}
    {}
};

template<typename U>
class Base<int, U>
{
public:
    int i ;
    Base<int, U>(int _i)
    :i{_i}
    {}
};


template<typename U>
class Derived<int, U>: public Base<int, U>
{
public:
    Derived(int _i)
    : Base<int, U>{_i}
    {}
    void print_i()
    {
        std::cout << i << std::endl;
    }

};

int main()
{
    Derived<int, bool> X(10);
    X.print_i();

    return 0;
}

期望:我期望我可以从相同类型的派生类成员函数访问基类成员变量。

当前输出:编译时错误提示:使用未声明的标识符“i”

【问题讨论】:

  • 在这种情况下,你必须明确告诉编译器 i 应该在它的基础中找到,要么使用 using 声明,要么在其前面加上 Base&lt;int, U&gt;:: [编辑:或查找另一种使其成为从属名称的方法]。在这里,related

标签: c++ c++11


【解决方案1】:

发生这种情况是因为编译器不会在相关基类中查找名称(如模板,这取决于实例化它们的类型)。

你能做些什么来解决它?

  1. 使用 this-&gt;i insted 或 i

  2. 使用Base&lt;int, U&gt;::i访问i

  3. 在访问成员之前插入 using Base&lt;int, U&gt;::member_name(它不适用于 coliru 上的数据成员)

您可以找到更多信息here

【讨论】:

  • 感谢@amc178,我可以假设使用 this->i 对性能没有影响吗?我认为这与我们可以访问基类成员的正常情况应该没有什么区别。
  • @Zingo 访问数据成员时,生成的汇编器是相同的,所以我想说没有性能损失。对于虚拟成员函数,情况可能并非如此。 Live example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多