Явный деструктор в шаблонном контексте

Я хочу явно уничтожить вектор в шаблонном контексте. У меня работает следующее (GNU C ++ 4.3, 4.4 и Clang ++ 1.1):

template <typename T>
void destroy_vector_owner(VectorOwner<T> *obj)
{
    obj->v.~vector();
    // further cleanup by Python API functions omitted
}

в то время как он не работает в Mac OS X v10.5 g ++ ( i686-apple-darwin10-gcc-4.2.1 ) с

expected class-name before ‘(’ token

Если я изменю его на

obj->v.~vector<T>();

код не компилируется с G ++, но Clang все еще может с этим справиться. Какая идиома правильная? Известно ли, что какой-либо из этих компиляторов не работает в этом отношении?

Обновление : определение VectorOwner is

template <typename T>
struct VectorOwner {
  PyObject_HEAD
  std::vector<T> v;
};

Это объект Python, который должен поддерживать жизнь std :: vector . Я признаю, что конструкция немного опасна, но мне нужно компактное хранилище, амортизируемое O (1) push_back и возможность украсть содержимое другого вектора с помощью члена swap .

10
задан Fred Foo 27 July 2011 в 14:35
поделиться