From 4e94cd757c824613b6b74275c4f4c31cc80bfa0b Mon Sep 17 00:00:00 2001 From: liaogang Date: Tue, 25 Jul 2017 17:46:20 +0800 Subject: [PATCH] FIX: restricting c++ template usage to POD types --- paddle/framework/detail/tensor-inl.h | 2 ++ paddle/memory/memory.h | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/paddle/framework/detail/tensor-inl.h b/paddle/framework/detail/tensor-inl.h index 4fc328d231..2acae1b0e2 100644 --- a/paddle/framework/detail/tensor-inl.h +++ b/paddle/framework/detail/tensor-inl.h @@ -44,12 +44,14 @@ inline T* Tensor::data() { template inline T* Tensor::mutable_data(DDim dims, platform::Place place) { + static_assert(std::is_pod::value, "T must be POD"); Resize(dims); return mutable_data(place); } template inline T* Tensor::mutable_data(platform::Place place) { + static_assert(std::is_pod::value, "T must be POD"); PADDLE_ENFORCE(product(dims_) > 0, "Tensor's numel must be larger than zero to call " "Tensor::mutable_data. Call Tensor::set_dim first."); diff --git a/paddle/memory/memory.h b/paddle/memory/memory.h index 5e0d647072..fd4d5e7082 100644 --- a/paddle/memory/memory.h +++ b/paddle/memory/memory.h @@ -29,10 +29,10 @@ void Free(Place, void*); template size_t Used(Place); -template ::value>::type* = nullptr> +template class PODDeleter { + static_assert(std::is_pod::value, "T must be POD"); + public: PODDeleter(Place place) : place_(place) {} void operator()(T* ptr) { Free(place_, static_cast(ptr)); }