diff --git a/include/aidge/operator/AvgPooling.hpp b/include/aidge/operator/AvgPooling.hpp
index 603fa94ce7e23021dfb9ec027d30ab0fb08aa37e..f0f9f6c54ed1953ed31b713ce19edc7a8e594d4a 100644
--- a/include/aidge/operator/AvgPooling.hpp
+++ b/include/aidge/operator/AvgPooling.hpp
@@ -79,7 +79,7 @@ public:
         }
         if (!(getInput(0)->empty())) {
             std::array<DimSize_t, DIM + 2> outputDims;
-            const std::array<DimSize_t, DIM + 2> inputDims(getInput(0)->dims<DIM+2>());
+            const std::array<DimSize_t, DIM + 2> inputDims(getInput(0)->template dims<DIM+2>());
             outputDims[0] = inputDims[0];
             outputDims[1] = inputDims[1];
 
@@ -104,7 +104,7 @@ public:
     //         std::vector<DimSize_t> inputIdxDims = outputIdxDims;
 
     //         for (DimIdx_t i = 0; i < (DIM+2); ++i) {
-    //             if (((outputDims[i] + outputIdxDims[i]) > mOutput->dims<DIM+2>()[i]) || (outputDims[i] == 0)) {
+    //             if (((outputDims[i] + outputIdxDims[i]) > mOutput->template dims<DIM+2>()[i]) || (outputDims[i] == 0)) {
     //                 AIDGE_THROW_OR_ABORT(std::runtime_error, "Given outputDim out of range for dimension %lu (%lu + %lu)", static_cast<std::size_t>(i), outputIdxDims[i], outputDims[i]);
     //             }
     //         }
diff --git a/include/aidge/operator/Conv.hpp b/include/aidge/operator/Conv.hpp
index 6c6e64db146b671e09e4549712e2a1e87c2c212a..4f0fb1ea2717c1fdf4443c450000ec3a56bb9b5b 100644
--- a/include/aidge/operator/Conv.hpp
+++ b/include/aidge/operator/Conv.hpp
@@ -100,7 +100,7 @@ public:
         }
         if (associated) {
             std::array<DimSize_t, DIM + 2> outputDims{};
-            const std::array<DimSize_t, DIM + 2> inputDims(getInput(0)->dims<DIM+2>());
+            const std::array<DimSize_t, DIM + 2> inputDims(getInput(0)->template dims<DIM+2>());
 
             for (std::size_t dim = 0; dim < this->template getAttr<ConvAttr::KernelDims>().size() ; ++dim) {
                 const DimSize_t kernelExtent = this->template getAttr<ConvAttr::DilationDims>()[dim] *
@@ -130,7 +130,7 @@ public:
     //         inputIdxDims[1] = 0; // each channel is used so start with the first one
 
     //         for (DimIdx_t i = 0; i < (DIM+2); ++i) {
-    //             if (((outputDims[i] + outputIdxDims[i]) > mOutput->dims<DIM+2>()[i]) || (outputDims[i] == 0)) {
+    //             if (((outputDims[i] + outputIdxDims[i]) > mOutput->template dims<DIM+2>()[i]) || (outputDims[i] == 0)) {
     //                 AIDGE_THROW_OR_ABORT(std::runtime_error, "Given outputDim out of range for dimension %lu (%lu + %lu)", static_cast<std::size_t>(i), outputIdxDims[i], outputDims[i]);
     //             }
     //         }
diff --git a/include/aidge/operator/ConvDepthWise.hpp b/include/aidge/operator/ConvDepthWise.hpp
index e03456aaaf8ad277d679d156d818fc1a20cfdc1f..ca6401e0ed3ac888f12858853f0d8f494c226041 100644
--- a/include/aidge/operator/ConvDepthWise.hpp
+++ b/include/aidge/operator/ConvDepthWise.hpp
@@ -91,7 +91,7 @@ public:
         }
         if (associated) {
             std::array<DimSize_t, DIM + 2> outputDims = {};
-            const std::array<DimSize_t, DIM + 2> inputDims(getInput(0)->dims<DIM+2>());
+            const std::array<DimSize_t, DIM + 2> inputDims(getInput(0)->template dims<DIM+2>());
 
             for (std::size_t dim = 0; dim < this->template getAttr<ConvDepthWiseAttr::KernelDims>().size() ; ++dim) {
                 const DimSize_t kernelExtent = this->template getAttr<ConvDepthWiseAttr::DilationDims>()[dim] *
@@ -125,7 +125,7 @@ public:
     //         auto inputIdxDims = outputIdxDims; // batch idx is the same
 
     //         for (DimIdx_t i = 0; i < (DIM+2); ++i) {
-    //             if (((outputDims[i] + outputIdxDims[i]) > mOutput->dims<DIM+2>()[i]) || (outputDims[i] == 0)) {
+    //             if (((outputDims[i] + outputIdxDims[i]) > mOutput->template dims<DIM+2>()[i]) || (outputDims[i] == 0)) {
     //                 AIDGE_THROW_OR_ABORT(std::runtime_error, "Given outputDim out of range for dimension %lu (%lu + %lu)", static_cast<std::size_t>(i), outputIdxDims[i], outputDims[i]);
     //             }
     //         }
diff --git a/include/aidge/operator/MaxPooling.hpp b/include/aidge/operator/MaxPooling.hpp
index 45aec34c1a6577896ca17aae6d055efc2c31f671..ad50a27a94a2217c94445fb556c84ec7f121c6b9 100644
--- a/include/aidge/operator/MaxPooling.hpp
+++ b/include/aidge/operator/MaxPooling.hpp
@@ -82,7 +82,7 @@ public:
         }
         if (!(getInput(0)->empty())) {
             std::array<DimSize_t, DIM + 2> outputDims{};
-            const std::array<DimSize_t, DIM + 2> inputDims(getInput(0)->dims<DIM+2>());
+            const std::array<DimSize_t, DIM + 2> inputDims(getInput(0)->template dims<DIM+2>());
 
             std::function<float(float)> roundingFunction;
             if (this->template getAttr<MaxPoolingAttr::CeilMode>()) {
diff --git a/include/aidge/operator/Pad.hpp b/include/aidge/operator/Pad.hpp
index 3fa6fa097d60c30a694d05e8097d1b3685241227..279b8b3d2c173d18c65c17e50385954a88fde77e 100644
--- a/include/aidge/operator/Pad.hpp
+++ b/include/aidge/operator/Pad.hpp
@@ -84,7 +84,7 @@ public:
         }
         if (associated) {
             std::array<DimSize_t, DIM + 2> outputDims{};
-            const std::array<DimSize_t, DIM + 2> inputDims = getInput(0)->dims<DIM+2>();
+            const std::array<DimSize_t, DIM + 2> inputDims = getInput(0)->template dims<DIM+2>();
 
             for (std::size_t dim = 0; dim < DIM; ++dim) {
                 outputDims[dim+2] = this->template getAttr<PadAttr::BeginEndBorders>()[2*dim]
diff --git a/include/aidge/operator/Slice.hpp b/include/aidge/operator/Slice.hpp
index f12afafabc534dff6d6a8d0eed2ba16021b92cc1..7bdbd8099ab79c9f1714989dc41cfc0893427bc9 100644
--- a/include/aidge/operator/Slice.hpp
+++ b/include/aidge/operator/Slice.hpp
@@ -75,7 +75,7 @@ public:
             AIDGE_THROW_OR_ABORT(std::runtime_error, "Error: input and slice dimensions are not the same size.");
         }
         std::array<DimSize_t, DIM> outputDims;
-        const std::array<DimSize_t, DIM> inputDims = getInput(0)->dims<DIM>();
+        const std::array<DimSize_t, DIM> inputDims = getInput(0)->template dims<DIM>();
 
         // Check that the sliced Tensor is actually part of the input Tensor
         // For a 5*5 tensor ('x') and a 3*3 slice kernel ('o'):