Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
264 views
in Technique[技术] by (71.8m points)

Syntax error with template in c++

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)<<"
";



     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 "Debuggeneric_max.unsuccessfulbuild".
1>ClCompile:
1>  generic_max.cpp
1>c:usersdaviddocumentsvisual studio 2010projectsgeneric_maxgeneric_maxgeneric_max.cpp(10): error C2563: mismatch in formal parameter list
1>          c:usersdaviddocumentsvisual studio 2010projectsgeneric_maxgeneric_maxgeneric_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:usersdaviddocumentsvisual studio 2010projectsgeneric_maxgeneric_maxgeneric_max.cpp(10): error C2568: '>' : unable to resolve function overload
1>          c:usersdaviddocumentsvisual studio 2010projectsgeneric_maxgeneric_maxgeneric_max.cpp(4): could be 'T max(T *,int)'
1>          c:program filesmicrosoft visual studio 10.0vcincludexutility(2086): or       'const _Ty &std::max(const _Ty &,const _Ty &,_Pr)'
1>          c:program filesmicrosoft visual studio 10.0vcincludexutility(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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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)<<"
";
    return 0; 
} 

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...