Tutorial :Syntax error with template in c++



Question:

I have following code:

#include <iostream>  using namespace std;  template<class T>  T max(T *data,int len){      int i;      T Max=data[0];         for (int i=1;i<len;i++){             if (data[i]>max){               Max=data[i];           }       }   return  Max;    }  int mai(){      int i[]={12,34,10,9,56,78,30};      int len=sizeof(i)/sizeof(i[0]);      cout<<max(i,len)<<"\n";             return 0;  }  

But when I compile it, I get the following errors:

generic_max, Configuration: Debug Win32 ------  1>Build started 7/29/2010 1:03:25 AM.  1>InitializeBuildStatus:  1>  Touching "Debug\generic_max.unsuccessfulbuild".  1>ClCompile:  1>  generic_max.cpp  1>c:\users\david\documents\visual studio 2010\projects\generic_max\generic_max\generic_max.cpp(10): error C2563: mismatch in formal parameter list  1>          c:\users\david\documents\visual studio 2010\projects\generic_max\generic_max\generic_max.cpp(22) : see reference to function template instantiation 'T max<int>(T *,int)' being compiled  1>          with  1>          [  1>              T=int  1>          ]  1>c:\users\david\documents\visual studio 2010\projects\generic_max\generic_max\generic_max.cpp(10): error C2568: '>' : unable to resolve function overload  1>          c:\users\david\documents\visual studio 2010\projects\generic_max\generic_max\generic_max.cpp(4): could be 'T max(T *,int)'  1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(2086): or       'const _Ty &std::max(const _Ty &,const _Ty &,_Pr)'  1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(2078): or       'const _Ty &std::max(const _Ty &,const _Ty &)'  1>  1>Build FAILED.  1>  1>Time Elapsed 00:00:00.95  ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========  

Please help me to fix this problem.


Solution:1

C++ is case-sensitive.

#include <iostream>    // Note the omission of `using namespace std;`. The declaration can  // introduce clashes if one of your functions happen to have the same name  // as the functions in the std namespace.    template<class T>   T max(T *data,int len) {       //int i; <-- Not needed? The for loop already has an `i` declared in it.      T Max=data[0];         for (int i=1;i<len;i++) {           /****** Note `Max`, not `max` ******/          // The typo in your code snippet is what's causing the C2563.          // `max` (in this context) refers to the function          // `template<class T> T max(T *data,int len)` that has been declared.          // `Max` refers to the variable declared in this function.           // (For the sake of readability, variable names should not similar          // to the function name).           if (data[i]>Max) {              Max=data[i];           }       }       return  Max;   }     /****** Note `main()`, not `mai()` ******/  int main() {      int i[]={12,34,10,9,56,78,30};       int len=sizeof(i)/sizeof(i[0]);      // `cout` should be just qualified with `std::` instead of      // `using namespace std`.       std::cout<<max(i,len)<<"\n";      return 0;   }   


Solution:2

Your max function is conflicting with the standard C++ function std::max because you have written using namespace std at the top of your program, which brings everything in the std namespace into the default namespace. The compiler can't tell if you wanted to call your max or some version of std::max.

Either change the name of your function, or remove using namespace std and explicitly prefix things in your program in the std namespace with std::.


Solution:3

if (data[i]>max) - change max to Max


Solution:4

In line 10, you probably mean >Max and not >max.


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »