相关疑难解决方法(0)

将'typedef'从基于'模板'的派生类传播

我正在尝试定义基类,它只包含typedef.

template<typename T>
class A
{
public:
    typedef std::vector<T> Vec_t;
};


template<typename T>
class B : public A<T>
{
private:
    Vec_t v;  // fails - Vec_t is not recognized
};
Run Code Online (Sandbox Code Playgroud)

BI中为什么会收到Vec_t无法识别的错误,我需要明确写出来?

typename A<T>::Vec_t v;
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates typedef name-lookup

61
推荐指数
4
解决办法
3万
查看次数

在模板化派生类中,为什么我需要在成员函数中使用"this->"限定基类成员名称?

当我调查Qt的源代码时,我发现trolltech的人明确使用this关键字来访问析构函数中的字段.

inline ~QScopedPointer()
{
    T *oldD = this->d;
    Cleanup::cleanup(oldD);
    this->d = 0;
}
Run Code Online (Sandbox Code Playgroud)

那么,这个用法有什么意义呢?有什么好处吗?

编辑:对于那些投票支持关闭此问题的人,我怀疑这种用法适用于某些类继承案例

QScopedPointer类定义的一部分:

template <typename T, typename Cleanup = QScopedPointerDeleter<T> >
class QScopedPointer
Run Code Online (Sandbox Code Playgroud)

c++ qt templates this name-lookup

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

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

上下文:
受保护和公共类成员的继承是面向对象编程的基本概念.下面的简单示例说明了一个经常遇到的情况,其中类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++中的依赖名称

我通常在模板的上下文中遇到这个术语"依赖名称".但是,我很少接触后者.因此,自然希望更多地了解依赖名称的概念.

您如何在模板和其他模板的上下文中理解它?这个例子受到了极大的鼓励

c++

16
推荐指数
2
解决办法
5632
查看次数

标签 统计

c++ ×4

templates ×3

name-lookup ×2

inheritance ×1

qt ×1

this ×1

typedef ×1