相关疑难解决方法(0)

为什么我必须通过this指针访问模板基类成员?

如果下面的类不是模板,我可以简单地x在derived课堂上.但是,使用下面的代码,我必须使用this->x.为什么?

template <typename T>
class base {

protected:
    int x;
};

template <typename T>
class derived : public base<T> {

public:
    int f() { return this->x; }
};

int main() {
    derived<int> d;
    d.f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates c++-faq

184
推荐指数
3
解决办法
2万
查看次数

"未在此范围内声明"模板和继承错误

这是代码示例,它可以重现我的问题:

template <typename myType>
class Base {
public:
    Base() {}
    virtual ~Base() {}
protected:
    int myOption;
    virtual void set() = 0;
};

template <typename InterfaceType>
class ChildClass : public Base < std::vector<InterfaceType> >
{
public:
    ChildClass() {}
    virtual ~ChildClass() {}
 protected:
    virtual void set();
};

template <typename InterfaceType>
void ChildClass<InterfaceType>::set()
{
     myOption = 10;
}
Run Code Online (Sandbox Code Playgroud)

我的用法main():

ChildClass<int> myObject;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误(ubuntu上的gcc 4.4.3):

'myOption'未在此范围内声明

如果我的ChildClass没有新的模板参数,这将工作正常,即:

class ChildClass : public Base < std::vector<SomeConcreteType> >
Run Code Online (Sandbox Code Playgroud)

编辑

如果我的set方法如下所示,我已设法解决它:

Base<std::vector<InterfaceType> >::myOption = 10;
Run Code Online (Sandbox Code Playgroud)

它工作正常.尽管不确定为什么我需要指定所有模板参数.

c++ inheritance templates compiler-errors g++

26
推荐指数
2
解决办法
2万
查看次数

受保护的成员在派生类中"未在此范围内声明"

#include <vector>
#include <iostream>

template <class T>
class Base
{
protected:
    std::vector<T> data_;
};

template <class T>
class Derived : public Base<T>
{
public:
    void clear()
    {
        data_.clear();
    }
};

int main(int argc, char *argv[])
{
    Derived<int> derived;
    derived.clear();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我无法编译这个程序.我明白了:

main.cpp:22: error: 'data_' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

拜托,你能解释为什么data_在Derived课堂上看不到?

c++ inheritance templates

23
推荐指数
2
解决办法
1万
查看次数

使用继承的类模板避免公共成员不可见性和源代码膨胀/重复的更好方法是什么?

上下文:
受保护和公共类成员的继承是面向对象编程的基本概念.下面的简单示例说明了一个经常遇到的情况,其中类CDerived继承了类的所有公共成员,CBase并添加了自己的1个附加函数,而不更改或显式重新定义或重新定义类的任何公共成员CBase.

#include <stdio.h>

class CBase
{
public:
    char Arr[32];

    int Fn1(void) {
        return Arr[1] ^ Arr[sizeof(Arr)-1];
    }

    int Fn2(void) {
        return Arr[2] ^ Arr[sizeof(Arr)-2];
    }
};


class CDerived : public CBase
{
public:  
    int FnSum(void) {
        return Fn1() + Fn2();
    }
};

int main(void)
{
    CDerived ddd;

    printf("%d\n", ddd.Fn1());
    printf("%d\n", ddd.Fn2());
    printf("%d\n", ddd.FnSum());

    return (int)ddd.Arr[0];
};
Run Code Online (Sandbox Code Playgroud)

上面的代码在所有主要编译器上编译都没有问题.

但是,如果希望" 模板化 "此代码,例如:通过参数化Arr数组的大小,那么CBase类模板的所有公共成员对CDerived符合最新C++标准的编译器上的类模板都是不可见的.
以下是问题代码:

#include <stdio.h>

template …
Run Code Online (Sandbox Code Playgroud)

c++ templates

21
推荐指数
2
解决办法
795
查看次数

标签 统计

c++ ×4

templates ×4

inheritance ×3

c++-faq ×1

compiler-errors ×1

g++ ×1