template <typename Type> struct testClass{
Type value;
};
int main(){
void* ptr = new testClass<int>;
ptr->value = 0;
return 0;
}
这不起作用,因为void指针不知道它指向的是什么类型,所以我必须将它转换为正确的数据类型。我不知道如何为模板类执行此操作。
我试过了:
(ptr<testClass>)->value = 0;
但错误表明它在&#39;&gt;&#39;之前缺少模板参数。我不确定如何将它强制转换为testClass(int)
答案 0 :(得分:4)
尽管事实上根本没有必要使用new
或void
- 指针:void*
指向 - 好 - void
。当用新分配的对象的地址初始化指针时,类型信息丢失。演员可以检索它:
static_cast<testClass<int>*>(ptr)->value = 0;
然而,我觉得有必要再次声明你不需要void
指针。如果需要动态分配存储,请使用指针对象的确切类型:
testClass<int>* ptr = new testClass<int>;
或者让编译器使用auto
为您推断。
auto ptr = new testClass<int>; // ptr has type testClass<int>*
并考虑使用智能指针,例如unique_ptr
答案 1 :(得分:1)
如果您使用的是C ++ 11,则可以使用auto
。
int main(){
auto ptr = new testClass<int>;
ptr->value = 0;
return 0;
}
如果您使用的是较旧的编译器,则可以使用:
int main(){
testClass<int>* ptr = new testClass<int>;
ptr->value = 0;
return 0;
}
答案 2 :(得分:1)
new运算符为给定类型T
分配内存,并将类型为T *
的指针返回给此类型。
在您的情况下,此类型为testClass<int>
,因此new testClass<int>
会返回testClass<int> *
。
如果要使用void指针,可以使用static_cast<testClass<int> *>
检索类型信息。
static_cast<testClass<int> *>(ptr)->value = 0;
关于(void)指针的使用的一些评论。
delete
释放/销毁。)您可以在堆栈上创建具有自动存储持续时间的对象,并在当前范围/函数结束时销毁。
testClass<int> obj;
obj.value = 0;
void
指针(如果您因任何原因需要动态分配)。您可以使用正确的类型。
testClass<int> * ptr = new testClass<int>;
ptr->value = 0;
delete ptr;
或使用C ++ 11
auto ptr = new testClass<int>; // where type of ptr is testClass<int>*
ptr->value = 0;
delete ptr;
一个例子是std::unique_ptr
处理唯一所有权。
#include <memory>
template <typename Type>
struct testClass{
Type value;
};
int main ()
{
std::unique_ptr<Foo> p1(new testClass<int>);
p1->value = 0;
return 0;
}