2011-11-03 28 views
1

我想建立一个模板,让我使用一个可调整大小的数组。有没有办法找到sizeof(T)?我使用的是malloc而不是new,因为我想在调整数组大小的函数中使用realloc。这是我的类的构造函数是得到错误:在C++中创建模板时可以找到sizeof(T)吗?

template <class T> 
set<T>::set(void) { 
arr = malloc(10 * sizeof(T)); 
numElts = 0; 
size = 10; 
}; 

我得到试图建立在以下错误消息:

error C2440: '=' : cannot convert from 'void *' to 'int *' 
1>   Conversion from 'void*' to pointer to non-'void' requires an explicit cast 
1>   c:\set.cpp(42) : while compiling class template member function 'set<T>::set(void)' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 

在我与调用它的主要功能:

set<int> *set1 = new set<int>(); 

从我所做的研究看来,编译器无法知道sizeof(T)如何使用,因此无法编译。我还会怎么做呢?

+4

请记住,你的'set'只能使用POD类型。 –

+5

错误*清楚*状态“无法从'void *'转换为'int *'”,甚至继续建议您需要显式强制转换将其关闭。显然,问题是它不知道'sizeof(T)'是什么。 –

+0

*它看起来像编译器无法知道sizeof(T)*使用什么* - 当然它确实;模板实现都是在编译时执行的。错误信息很明显;你需要施放malloc的结果。至于你为什么使用malloc ...不知道。 malloc不会为你调用构造函数。 –

回答

13

malloc返回void*,并且当将被分配Ç允许不兼容的指针,C++没有。假设arr被定义为T*,您需要投射到T* malloc的结果。

arr = static_cast< T* >(malloc(10 * sizeof(T))); 

有在模板内调用sizeof(T),只要T没有问题的完成在实例化点(和int是一个基本类型,它总是完成)。

+2

工作代码:'arr = static_cast (malloc(10 * sizeof(T)));' – Pubby

+0

谢谢!这照顾了它。也感谢您解释C和C++之间的差异。 – Dom12

+0

如果您以惯用的方式使用'malloc',则实际上并不需要任何强制转换,因为您将使用生成的void指针作为放置位置新参数的参数。投射是程序员的一部分丑陋的快捷方式的一个症状,它假定了该类型的POD。 –

1

我认为你是过度分析问题。它只是告诉你,你需要将malloc返回的void*转换为T*类型的arr

1

当然可以。这不是你遇到错误的原因。我想set::arr成员的类型是T*。由于您使用模板参数类型int实例化了set类,因此该成员变量的声明变为int *arr;。 C++,不像C,不允许你隐式地从void *转换到另一个指针类型。所以你需要投下malloc电话的结果。

arr = static_cast<T *>(malloc(10 * sizeof(T))); 

此外,请记住,当你实际插入的元素进入设置你需要使用放置新构造元素融入到缓冲区你分配,然后显式调用析构函数时复制/移动/移除它们。

+1

据推测,目的不是空的'set'有10个元素,而是要有10个元素的*空格*,只要他在插入时正确地构造对象,所有东西都保持洁净。当然,鉴于手头的问题,发生这种情况的可能性很小。 –

+1

此外,'realloc'_can_扩展现有内存(有时)并自动复制数据。所以有利于realloc。特别是在使用POD时。 –

+0

@DennisZickefoose是的,你说得对。我将'numElts = 0;'读作'numElts = 10;'。我已经更新了答案。 – Praetorian

相关问题