2013-03-27 6 views
0

다음 코드가 있습니다.오버로드 된 템플릿 함수 호출이 모호합니다.

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 

template <typename Type> inline Type max(Type t1, Type t2) { 
    return t1 > t2 ? t1 : t2; 
} 

template <typename Type> inline Type max(const std::vector<Type> &vec) { 
    return *std::max_element(vec.begin(),vec.end()); 
} 

template <typename Type> inline Type max(const Type *parray, int size) { 
return *std::max_element(parray,parray+size); 
} 

int main(int argc, char *argv[]) { 
    std::string sarray[] = {"we","were","her","pride","of","ten"}; 
    std::vector<std::string> svec(sarray,sarray+6); 

    int iarray[] = {12,70,2,169,1,5,29}; 
    std::vector<int> ivec(iarray,iarray+7); 

    float farray[] = {2.5,24.8,18.7,4.1,23.9}; 
    std::vector<float> fvec(farray,farray+5); 

    int imax = max(max(ivec),max(iarray,7)); 
    float fmax = max(max(fvec),max(farray,5)); 
    std::string smax = max(max(svec),max(sarray,6)); 

    std::cout << "imax should be 169 -- found: " << imax << '\n' 
       << "fmax should be 24.8 -- found: " << fmax << '\n' 
       << "smax should be were -- found: " << smax << '\n'; 
    return 0; 
} 

벡터와 배열의 최대 요소를 출력하는 두 개의 간단한 템플릿 함수를 구현하려고합니다. 그러나 형식이 문자열 인 경우 다음과 같은 오류가 발생합니다.

error: call of overloaded 'max(std::string, std::string)' is ambiguous 

왜 이런 현상이 발생하며이를 해결하는 가장 좋은 방법은 무엇입니까?

답변

2

귀하의 코드

std::string smax = max(max(svec),max(sarray,6)); 

후 너무 많은 일 ;이 번역입니다. 이제 여기에 문제가 발생합니다 : 표준 라이브러리에는 이미 템플릿 max() 함수가 있습니다. 컴파일러는 max() 또는 std::max() 버전을 원하는지 여부를 알 수 없습니다. 이제 정수 및 부동 소수점이 작동하는 이유를 묻습니다. 이 줄에는 특히 std::string을 언급하는 답변이 있습니다. 따라서 컴파일러가 혼란스러워지고 있습니다. 해결 방법이있을 수 있습니다. 하지만 당신은 최고의 솔루션이 필요하기 때문에, 나는 당신의 최대 함수를 MAximum이라고 부른다.

+0

고마워. 이것은 의미가 있습니다. – idealistikz

3

컴파일러가 max을 통해 ADL을 통해 일치하는 정의를 여러 개 찾고있어 선택할 수없는 경우가 있습니다.

std::string smax = ::max(max(svec),max(sarray,6)); 
+1

@idealistikz 그 이유는 오타가 있기 때문입니다. 그 줄에서 여분의 세미콜론을 제거하면됩니다. –

+0

정의 된 함수 'max'가 다른 유형과 작동하기 때문에 어떻게 작동합니까? – idealistikz

+1

그것은'std :: string'처럼'std' 네임 스페이스에 없기 때문에 다른 타입들과 함께 작동합니다. 함수의 이름을 다르게 지정하십시오 (예 :'my_max') 또는 표시된 정규화 된 ID를 사용하십시오. –

0

왜이 발생하는이 :

의 자격을 갖춘-ID를 사용하는 max에 전화를 변경해보십시오?
컴파일러 오류가 이미 원인을 알려줍니다. 어떤 버전의 max을 사용할지는 알지 못합니다.

참고 후보들은 :
가 MAIN.CPP : 6 : 38 : 참고 : [타입 = 표준 : basic_string 포함] 타입 맥스 (유형, 유형)
...
가 에/usr/포함 /c++/4.7/bits/stl_algobase.h:210:5 참고 : CONST _Tp & 표준 : 최대 (CONST _Tp &, CONST _Tp &)

솔루션 [_Tp = 표준 : basic_string 함께] :
명시 적으로 귀하의 max 함수를 호출하거나 std::max (이미 존재하는, 그래서 당신은 그것을 다시 구현하고 싶습니다?)를 호출합니다. 템플릿을 사용하여 평가

std::string smax = max(string ,string); 

max(svec)max(sarray,6) :에

또한, << "fmax should be 24.8 -- found: " << fmax << '\n'

+0

템플릿 함수를 이해하려고 시도하기 때문에 다시 구현하고 싶습니다. – idealistikz

+0

오케이, 그건 좋은 이유 야. – Misch

관련 문제