템플릿으로 함수에서 특성을 사용하여 명시 적 생성자/소멸자를 호출하려고합니다.템플릿으로 된 함수에서 특성을 사용하여 명시 적 생성자/소멸자를 호출하십시오.
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();
물론이 접근 방식에는 제한이 있습니다 ... 기본 생성자 만 사용할 수 있습니다. 나는 overloading new에 대해 생각했지만, 모든 type_t의 새로운 오버로딩을 필요로하고, 기존 코드의 동작을 바꿀 것이다.
왜 소멸자를 호출합니까 ?? – TemplateRex
실제로 무엇을하려고합니까? 어떤 소멸자를 부르려고? –