diff --git a/modules/cudaarithm/src/cuda/div_scalar.cu b/modules/cudaarithm/src/cuda/div_scalar.cu
index d3d2ce03f..97ada8341 100644
--- a/modules/cudaarithm/src/cuda/div_scalar.cu
+++ b/modules/cudaarithm/src/cuda/div_scalar.cu
@@ -56,18 +56,16 @@ void divScalar(const GpuMat& src, cv::Scalar val, bool inv, GpuMat& dst, const G
 
 namespace
 {
-    template <int cn> struct SafeDiv;
-    template <> struct SafeDiv<1>
+    template <typename T, int cn> struct SafeDiv;
+    template <typename T> struct SafeDiv<T, 1>
     {
-        template <typename T>
         __device__ __forceinline__ static T op(T a, T b)
         {
             return b != 0 ? a / b : 0;
         }
     };
-    template <> struct SafeDiv<2>
+    template <typename T> struct SafeDiv<T, 2>
     {
-        template <typename T>
         __device__ __forceinline__ static T op(const T& a, const T& b)
         {
             T res;
@@ -78,9 +76,8 @@ namespace
             return res;
         }
     };
-    template <> struct SafeDiv<3>
+    template <typename T> struct SafeDiv<T, 3>
     {
-        template <typename T>
         __device__ __forceinline__ static T op(const T& a, const T& b)
         {
             T res;
@@ -92,9 +89,8 @@ namespace
             return res;
         }
     };
-    template <> struct SafeDiv<4>
+    template <typename T> struct SafeDiv<T, 4>
     {
-        template <typename T>
         __device__ __forceinline__ static T op(const T& a, const T& b)
         {
             T res;
@@ -114,7 +110,7 @@ namespace
 
         __device__ __forceinline__ DstType operator ()(SrcType a) const
         {
-            return saturate_cast<DstType>(SafeDiv<VecTraits<ScalarType>::cn>::op(saturate_cast<ScalarType>(a), val));
+            return saturate_cast<DstType>(SafeDiv<ScalarType, VecTraits<ScalarType>::cn>::op(saturate_cast<ScalarType>(a), val));
         }
     };
 
@@ -124,7 +120,7 @@ namespace
 
         __device__ __forceinline__ DstType operator ()(SrcType a) const
         {
-            return saturate_cast<DstType>(SafeDiv<VecTraits<ScalarType>::cn>::op(val, saturate_cast<ScalarType>(a)));
+            return saturate_cast<DstType>(SafeDiv<ScalarType, VecTraits<ScalarType>::cn>::op(val, saturate_cast<ScalarType>(a)));
         }
     };