在模板中调用参数的构造函数,如何实现?

雨中的月儿 2013-06-20 04:41:42
直接上代码
template<typename T>
class CMyWrapper()
{
public:
void TestIt()
{
T* p = ::operator new (sizeof(T)); // 之所以使用::operator new,使因为在T中已经重载了new操作符
p->T::T(); // 在这个地方应该如何写,才能正确调用构造函数?
}
}

请高手帮忙解答!
...全文
225 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2013-06-21
  • 打赏
  • 举报
回复
::new (p) T ; 肯定是可以的. 要用默认的 new 也不用搞得这和麻烦. T *p = ::new T; 就可以了.
ri_aje 2013-06-21
  • 打赏
  • 举报
回复
引用 12 楼 yysbest 的回复:
[quote=引用 8 楼 rocktyt2 的回复:] [quote=引用 7 楼 yysbest 的回复:] [quote=引用 2 楼 u010936098 的回复:] 看来楼主是不想使用T类自定义的内存分配函数。

template<typename T>
class CMyWrapper()
{
public:
    void TestIt()
    {
     T* p = ::operator new (sizeof(T));   // 之所以使用::operator new,使因为在T中已经重载了new操作符
     new p(T);

    //do something
 
   //同时释放时也不能再delete p,而要用全局的delete,
   //要与分配代码匹配:
    p->~T();
    ::operator delete(p);

    }    
}
非常感谢你的建议,使用replacement new来完成手工调用构造函数的目的。 不过,我在vc2008下试了一下,如果我没有重载T的new,是可以的。如果已经重载了T的new,new p(T)这句话就出现了编译错误。。。。 [/quote]试试 ::new p(T); ?[/quote] 呵呵,在重载了new操作符之后,用::new p(T)和::new (p)T都不行阿。。。。[/quote] 把代码上全了。
derekrose 2013-06-20
  • 打赏
  • 举报
回复
引用 3 楼 yysbest 的回复:
[quote=引用 1 楼 derekrose 的回复:] 你的new是干啥的,纯粹分配空间?
我自己重载的new操作符有作它用,所以肯定不能在这个地方调用自己的new操作符,只能调用::operator new()全局new,然后自己手工调用这个类对象的构造函数。 我不知道你是否可以理解我的意思,呵呵。[/quote] 当然理解,但有作他用是个什么意思?
橡木疙瘩 2013-06-20
  • 打赏
  • 举报
回复
如果还不行,就:

#include <memory>
...
std::allocator<T>().construct(p, T());
如果这个可以编译,那么在construct上点右键,选择“转到定义”,看看stl中如何实现。
橡木疙瘩 2013-06-20
  • 打赏
  • 举报
回复
用::new (p)T应该是可以的,我下面这段代码用gcc和vc编译都通过了。 ::new (p)T(); 和 ::new (p)T(4321); 也都试过,全都没问题。 gcc用的MinGW 4.4.1 vc用的是VC9(vs2008带的那个)

#include <iostream>
#include <new>

class custom_new
{
public:
  custom_new( int value = 1234 )
    : my_value( value )
  {

  }
  operator int() const
  {
	  return my_value;
  }
  void * operator new ( size_t size )
  {
	  return new char[size];
  }
  void operator delete( void * p )
  {
	  delete []static_cast<char*>(p);
  }
private:
  int my_value;
};

template< typename T >
class global_new
{
public:
	global_new()
	{
		my_data = static_cast<T*>(::operator new( sizeof(T)));
		::new (my_data)T;
	}
	~global_new()
	{
		my_data->~T();
		::operator delete(my_data);
	}
	T * get_data()
	{
		return my_data;
	}
private:
	T * my_data;
};
int main(int argc, char **argv)
{
	global_new<custom_new> obj;
	std::cout << * obj.get_data();
	std::cin.get();
	return 0;
}
雨中的月儿 2013-06-20
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
类模版可以认为是为广泛类型定义对象一种机制,不是为T创建构造函数,是为CMyWrapper创建构造函数, template <T> class aClass { T a; T b; aClass(T a1,T b1) { a=a1; b=b1; }; } T是一种虚拟的类型,在定义该段,谁也不知道T是什么东西 实例化对象 aClass<int> a;//那么类型T就是int aClass<bClass> a;//那么类型T就是bClass 以此类推
不管是什么东西,不管是基本类型,还是复合类型,都有自己默认的构造函数,对吧?为什么我不能再这儿调用呢?呵呵。
橡木疙瘩 2013-06-20
  • 打赏
  • 举报
回复
::new (p) T;
雨中的月儿 2013-06-20
  • 打赏
  • 举报
回复
引用 4 楼 icechenbing 的回复:
你的模板T为什么要重载new操作符?
哥们,模板T重载new的目的有很多阿,比如手工内存管理。
雨中的月儿 2013-06-20
  • 打赏
  • 举报
回复
引用 8 楼 rocktyt2 的回复:
[quote=引用 7 楼 yysbest 的回复:] [quote=引用 2 楼 u010936098 的回复:] 看来楼主是不想使用T类自定义的内存分配函数。

template<typename T>
class CMyWrapper()
{
public:
    void TestIt()
    {
     T* p = ::operator new (sizeof(T));   // 之所以使用::operator new,使因为在T中已经重载了new操作符
     new p(T);

    //do something
 
   //同时释放时也不能再delete p,而要用全局的delete,
   //要与分配代码匹配:
    p->~T();
    ::operator delete(p);

    }    
}
非常感谢你的建议,使用replacement new来完成手工调用构造函数的目的。 不过,我在vc2008下试了一下,如果我没有重载T的new,是可以的。如果已经重载了T的new,new p(T)这句话就出现了编译错误。。。。 [/quote]试试 ::new p(T); ?[/quote] 呵呵,在重载了new操作符之后,用::new p(T)和::new (p)T都不行阿。。。。
雨中的月儿 2013-06-20
  • 打赏
  • 举报
回复
引用 10 楼 u010936098 的回复:
不好意思,写错了。 应该是 new (p)T; 或者是 new (p)T(参数列表); 最好加上: #include <new>
呵呵,还是不行啊,只要重载了new操作符,replacement new就会报编译错误。
橡木疙瘩 2013-06-20
  • 打赏
  • 举报
回复
不好意思,写错了。 应该是 new (p)T; 或者是 new (p)T(参数列表); 最好加上: #include <new>
ri_aje 2013-06-20
  • 打赏
  • 举报
回复
placement new 是这么写的 new (p) T;
rocktyt 2013-06-20
  • 打赏
  • 举报
回复
引用 7 楼 yysbest 的回复:
[quote=引用 2 楼 u010936098 的回复:] 看来楼主是不想使用T类自定义的内存分配函数。

template<typename T>
class CMyWrapper()
{
public:
    void TestIt()
    {
     T* p = ::operator new (sizeof(T));   // 之所以使用::operator new,使因为在T中已经重载了new操作符
     new p(T);

    //do something
 
   //同时释放时也不能再delete p,而要用全局的delete,
   //要与分配代码匹配:
    p->~T();
    ::operator delete(p);

    }    
}
非常感谢你的建议,使用replacement new来完成手工调用构造函数的目的。 不过,我在vc2008下试了一下,如果我没有重载T的new,是可以的。如果已经重载了T的new,new p(T)这句话就出现了编译错误。。。。 [/quote]试试 ::new p(T); ?
雨中的月儿 2013-06-20
  • 打赏
  • 举报
回复
引用 2 楼 u010936098 的回复:
看来楼主是不想使用T类自定义的内存分配函数。

template<typename T>
class CMyWrapper()
{
public:
    void TestIt()
    {
     T* p = ::operator new (sizeof(T));   // 之所以使用::operator new,使因为在T中已经重载了new操作符
     new p(T);

    //do something
 
   //同时释放时也不能再delete p,而要用全局的delete,
   //要与分配代码匹配:
    p->~T();
    ::operator delete(p);

    }    
}
非常感谢你的建议,使用replacement new来完成手工调用构造函数的目的。 不过,我在vc2008下试了一下,如果我没有重载T的new,是可以的。如果已经重载了T的new,new p(T)这句话就出现了编译错误。。。。
worldy 2013-06-20
  • 打赏
  • 举报
回复
类模版可以认为是为广泛类型定义对象一种机制,不是为T创建构造函数,是为CMyWrapper创建构造函数, template <T> class aClass { T a; T b; aClass(T a1,T b1) { a=a1; b=b1; }; } T是一种虚拟的类型,在定义该段,谁也不知道T是什么东西 实例化对象 aClass<int> a;//那么类型T就是int aClass<bClass> a;//那么类型T就是bClass 以此类推
橡木疙瘩 2013-06-20
  • 打赏
  • 举报
回复
new (指针变量)类型(构造参数) 这是placement new语法,这个new不会分配内存,只会在指针变量所指向的内存上构造对象,也就是把该“指针变量”作为this参数调用“类型”的构造函数。
恨天低 2013-06-20
  • 打赏
  • 举报
回复
你的模板T为什么要重载new操作符?
橡木疙瘩 2013-06-20
  • 打赏
  • 举报
回复
看来楼主是不想使用T类自定义的内存分配函数。

template<typename T>
class CMyWrapper()
{
public:
    void TestIt()
    {
     T* p = ::operator new (sizeof(T));   // 之所以使用::operator new,使因为在T中已经重载了new操作符
     new p(T);

    //do something
 
   //同时释放时也不能再delete p,而要用全局的delete,
   //要与分配代码匹配:
    p->~T();
    ::operator delete(p);

    }    
}
雨中的月儿 2013-06-20
  • 打赏
  • 举报
回复
引用 1 楼 derekrose 的回复:
你的new是干啥的,纯粹分配空间?
我自己重载的new操作符有作它用,所以肯定不能在这个地方调用自己的new操作符,只能调用::operator new()全局new,然后自己手工调用这个类对象的构造函数。 我不知道你是否可以理解我的意思,呵呵。
derekrose 2013-06-20
  • 打赏
  • 举报
回复
你的new是干啥的,纯粹分配空间?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧