【发布时间】: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中的数据数组具有哪种类型。
正如所写,编译器给出了一些错误:
“sizeof”对不完整类型“T”的无效应用
不完整类型“class T”的使用无效(因为 someFunction 中的指针内容)
- 无效参数 '(因为调用了 B.someFunction(&A))
- 没有匹配函数调用'classB::someFunction(classA*)'
我的问题是:
为了实现以下功能,我必须进行哪些更改?应该允许给
someFunction的指针具有任意数据类型,并且上面显示的操作应该在没有不完整类型错误的情况下工作。在 main 中调用 someFunction 的正确语法是什么?
我已经尝试了不同的方法,但没有任何帮助:-(
【问题讨论】:
-
你为什么不改用
std:: vector?