Я хочу явно уничтожить vector
в шаблоном контексте. Следующие работы для меня (GNU С++ 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
template <typename T>
struct VectorOwner {
PyObject_HEAD
std::vector<T> v;
};
Это объект Python, который должен содержать std::vector
. Я признаю, что конструкция немного опасна, но мне нужно компактное хранилище, амортизированное O (1) push_back
и возможность украсть другое векторное содержимое с помощью элемента swap
.