相关疑难解决方法(0)

派生对基类成员数据的模板类访问

这个问题是一个在问的赞助这个线程.

使用以下类定义:

template <class T>
class Foo {

public:
    Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
    {
        /* do something for foo */
    }
    T Foo_T;        // either a TypeA or a TypeB - TBD
    foo_arg_t _foo_arg;
};

template <class T>
class Bar : public Foo<T> {
public:
    Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
    : Foo<T>(bar_arg)   // base-class initializer
    {

        Foo<T>::Foo_T = T(a_arg);
    }

    Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
    : Foo<T>(bar_arg)
    {
        Foo<T>::Foo_T = T(b_arg);
    } …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates scope name-lookup

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

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

上下文:
受保护和公共类成员的继承是面向对象编程的基本概念.下面的简单示例说明了一个经常遇到的情况,其中类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++ Template类继承具有模板指定输入类型的另一个模板类

可能的重复:
GCC问题:使用依赖于模板参数的基类成员
为什么当VS没有时,GCC在模板中需要额外的声明?
为什么派生模板类不能访问基本模板类
iphone编译器继承模板化基类,传递类型未及时扩展(只看)

抱歉这个令人困惑的标题,我能想出最好的.

这里有一些代码来说明我的问题......

基本模板类:

template<class T> class TestBase
{
public:
   int someInt;
};
Run Code Online (Sandbox Code Playgroud)


试图用另一个模板类继承TestBase ...

这在编译时得到"someInt未在此范围内声明":

template<class X> class TestSub : public TestBase<X>
{
   void testf()
   {
       someInt = 0; //Error: "someInt was not declared in this scope"
   }
};
Run Code Online (Sandbox Code Playgroud)



B)这很好用(不同之处在于我明确指定了TestBase的模板输入)

template<class X> class TestSub : public TestBase<string>
{
   void testf()
   {
       someInt = 0;
   }
};
Run Code Online (Sandbox Code Playgroud)



为什么(A)的TestSub没有像(B)中那样正确地继承someInt?

提前致谢.

c++ inheritance templates

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

C++模板类和继承

可能重复:
[FAQ] 为什么派生模板类不能访问基本模板类的标识符? c ++中基类中受保护字段的问题
无法访问类模板中的数据成员

以下代码给出了编译错误.怎么了?

struct Base {
   int amount;
};

template<class T> struct D1 : public Base {
};

template<class T>
struct D2 : D1<T> {
  void foo() { amount=amount*2; /* I am trying to access base class data member */ };
};

int main() {
  D2<int> data;
};


test.cpp: In member function 'void D2<T>::foo()':
test.cpp:11: error: 'amount' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

谢谢

c++ inheritance templates

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

C++:模板化继承的递归类:不可能的三重威胁?

所以,假设您有一个递归的基类(例如链表)和派生类.派生类应该重用基类中的构造函数,因为您不想编写冗余代码.你可以尝试一下这个显而易见的事情,它不会起作用:

class Base {
public:

     Base(int size) {
      if (size <= 0) { next = NULL; }
      else { next = new Base(size - 1); }
     }
     void print() { 
      cout << " Base  ";
      if (next != NULL) { next->print(); }
     }
protected:
     Base *next;
};
class Derived: public Base {
public:
     Derived(int size) : Base(size) {} 
     void print() 
      { 
           cout << " Derived ";
           if (next != NULL) 
           { next->print(); }
      }

};
int main()
{

     Derived d2(5); …
Run Code Online (Sandbox Code Playgroud)

c++ recursion inheritance templates compilation

6
推荐指数
1
解决办法
1322
查看次数

为什么不能推导嵌套在模板类中的枚举的模板参数?

我有一些这样命名的常量:

template<int n> class usart {
private:
    usart();
public:
    enum class tx {};
    enum class rx {};
    enum class ck {};
};

template<> class usart<1> {
public:
    enum class tx { A9  = gpio::A9,  C4 = gpio::C4 };
    enum class rx { A10 = gpio::A10, C5 = gpio::C5 };
    enum class ck { A8  = gpio::A8 };
};

// two more of these
Run Code Online (Sandbox Code Playgroud)

where gpio只是一个简单的整数枚举.

我想在另一个文件中对我的类强制执行某些类型的安全性:

class USART {
public:
    template<int N>
    USART(typename usart<N>::tx pin_tx, typename usart<N>::rx pin_rx) { …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

3
推荐指数
1
解决办法
835
查看次数

是否有另一种模板基类继承的解决方法?

此代码在GNU编译器中产生错误:

class A
{
public:
    int X;
};

template<class T>
class Foo : public T
{
public:
    void doStuff();
};

template<class T>
void Foo<T>::doStuff()
{
    X++;
}
Run Code Online (Sandbox Code Playgroud)

已经有一个答案为什么这是一个错误.我想知道是否有另一种解决此错误的方法而不是使用

T::X
Run Code Online (Sandbox Code Playgroud)

每次我想引用X成员.我试过这个:

template<class T>
void Foo<T>::doStuff()
{
    using T::X;
    X++;
}
Run Code Online (Sandbox Code Playgroud)

但是GCC给出了一个错误:"不允许使用类限定名称"

c++ inheritance gcc templates

1
推荐指数
1
解决办法
958
查看次数

标签 统计

c++ ×7

templates ×7

inheritance ×5

c++11 ×1

compilation ×1

gcc ×1

name-lookup ×1

recursion ×1

scope ×1