【问题标题】:Passing pointer to template class object to a function correctly将指向模板类对象的指针正确传递给函数
【发布时间】:2018-07-29 11:56:42
【问题描述】:

我有一些这样的代码:

template<class T> class classA
{
public:
    classA(uint32_t max) : numElements(max)
    {
        data = new T[numElements];
    }
    ~classA() {delete[] data;}

    uint32_t size()
    {
        return numElements;
    }

    T *data;

private:
    const int numElements;
};

class classB
{
public:
    classB(uint8_t* adress) : ptr(adress){}

    void someFunction(classA<class T>* x)
    {
        uint8_t size = sizeof(T);
        /*
        do some stuff with the type size of T
        */

        T* ptr1 = (T*)ptr; // create new pointer with same adress as ptr but different data type
        /*
        write some data from ptr1[i] to x->A[i]
        */
    }

private:
    uint8_t* ptr;
};


int main()
{
    classB B(/*some memory adress*/);
    classA<uint16_t> A(5)
    B.someFunction(&A);
}

这段代码(这里非常简化)应该使classB的对象可以从特定的内存地址开始将数据写入classA对象的数据字段,无论classA中的数据数组具有哪种类型。

正如所写,编译器给出了一些错误:

  1. “sizeof”对不完整类型“T”的无效应用

  2. 不完整类型“class T”的使用无效(因为 someFunction 中的指针内容)

  3. 无效参数 '(因为调用了 B.someFunction(&A))
  4. 没有匹配函数调用'classB::someFunction(classA*)'

我的问题是:

  1. 为了实现以下功能,我必须进行哪些更改?应该允许给someFunction 的指针具有任意数据类型,并且上面显示的操作应该在没有不完整类型错误的情况下工作。

  2. 在 main 中调用 someFunction 的正确语法是什么?

我已经尝试了不同的方法,但没有任何帮助:-(

【问题讨论】:

  • 你为什么不改用std:: vector

标签: c++ templates pointers


【解决方案1】:

为了实现以下功能,我必须进行哪些更改?应该允许给someFunction 的指针具有任意数据类型,并且上面显示的操作应该在没有不完整类型错误的情况下工作。

所以someFunction 本身需要是一个模板。因此它需要适当的template 标头:

template<class T>
void someFunction(classA<T>* x)
{
    uint8_t size = sizeof(T);
    /*
    do some stuff with the type size of T
    */

    T* ptr1 = (T*)ptr; // create new pointer with same adress as ptr but different data type
    /*
    write some data from ptr to x->A[i]
    */
}

除了你的语法看起来正确之外。

【讨论】:

  • 我假设你的意思是模板而不是类型名。如果我按照您的解决方案进行操作,一切正常,但调用 someFunction 时会出现错误(未定义对 ... 的引用)。
  • @nuno95 - 是的,这是一个错字。如果您收到链接器错误,则意味着您忘记了templates must be implemented in a header
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
相关资源
最近更新 更多