我試圖在模板化函數中調用具有特徵的顯式構造函數/析構函數。在模板化函數中調用具有特徵的顯式構造函數/析構函數
template <int i>
struct Traits
{
};
template <>
struct Traits<1>
{
typedef Foo type_t;
};
template <>
struct Traits<2>
{
typedef Bar type_t;
};
template <class Traits>
void DoSomething(void* p_in)
{
typename Traits::type_t* p = reinterpret_cast<typename Traits::type_t*>(p_in);
// this works.
new (p) typename Traits::type_t;
// neither of following two does work.
p->~typename Traits::type_t();
p->typename ~Traits::type_t();
}
// call
void* p_in = malloc(BIG_ENOUGH);
DoSomething<Traits<1> >(p_in);
free(p_in);
在具有-ansi標誌的GCC 4.4.3中,調用顯式構造函數可以正常工作。但是,調用顯式析構函數不起作用,給出以下錯誤:
error: expected identifier before 'typename'
error: expected ';' before 'typename'
我懷疑是缺少一些括號或關鍵字。
UPDATE
人們問我爲什麼要這麼做?是的,正如預期的,我要使用的內存池,並給兩個功能給客戶。在內部它使用一個靜態指針指向內存池malloc/free。
template<class Traits>
typename Traits::type_t* memory_pool_new();
template<class Traits>
void memory_pool_delete();
當然這種方法有侷限性...就像只有默認的構造函數可以使用。我想過要重載new,但它需要重載所有type_t的new,它會改變現有代碼的行爲。
你爲什麼要調用析構函數? – TemplateRex 2012-08-16 13:32:34
你究竟想做什麼?試圖調用哪個析構函數? – 2012-08-16 13:34:32