diff --git a/modules/flann/include/opencv2/flann/any.h b/modules/flann/include/opencv2/flann/any.h index 7140b2a08..7e3fd797a 100644 --- a/modules/flann/include/opencv2/flann/any.h +++ b/modules/flann/include/opencv2/flann/any.h @@ -150,13 +150,27 @@ SMALL_POLICY(bool); #undef SMALL_POLICY -/// This function will return a different policy for each type. -template -base_any_policy* get_policy() +template +class SinglePolicy { + SinglePolicy(); + SinglePolicy(const SinglePolicy& other); + SinglePolicy& operator=(const SinglePolicy& other); + +public: + static base_any_policy* get_policy(); + +private: static typename choose_policy::type policy; - return &policy; -} +}; + +template +typename choose_policy::type SinglePolicy::policy; + +/// This function will return a different policy for each type. +template +inline base_any_policy* SinglePolicy::get_policy() { return &policy; } + } // namespace anyimpl struct any @@ -170,26 +184,26 @@ public: /// Initializing constructor. template any(const T& x) - : policy(anyimpl::get_policy()), object(NULL) + : policy(anyimpl::SinglePolicy::get_policy()), object(NULL) { assign(x); } /// Empty constructor. any() - : policy(anyimpl::get_policy()), object(NULL) + : policy(anyimpl::SinglePolicy::get_policy()), object(NULL) { } /// Special initializing constructor for string literals. any(const char* x) - : policy(anyimpl::get_policy()), object(NULL) + : policy(anyimpl::SinglePolicy::get_policy()), object(NULL) { assign(x); } /// Copy constructor. any(const any& x) - : policy(anyimpl::get_policy()), object(NULL) + : policy(anyimpl::SinglePolicy::get_policy()), object(NULL) { assign(x); } @@ -214,7 +228,7 @@ public: any& assign(const T& x) { reset(); - policy = anyimpl::get_policy(); + policy = anyimpl::SinglePolicy::get_policy(); policy->copy_from_value(&x, &object); return *this; } @@ -269,7 +283,7 @@ public: void reset() { policy->static_delete(&object); - policy = anyimpl::get_policy(); + policy = anyimpl::SinglePolicy::get_policy(); } /// Returns true if the two types are the same.