2010-02-09 3 views
0

저는 C++의 템플릿을 처음 사용합니다. 나는 작은 프로그램을 시도하고있었습니다. C++ 템플릿 문제

CPP [80]> cat 000001.cpp 000001.hpp 
#include <iostream> 
#include <string> 
#include "000001.hpp" 

int main() 
{ 
    int i = 42; 
    std::cout << "max(7,i): " << ::max(7,i) << std::endl; 

    double f1 = 3.4; 
    double f2 = -6.7; 
    std::cout << "max(f1,f2): " << ::max(f1,f2) << std::endl; 

    std::string s1 = "mathematics"; 
    std::string s2 = "math"; 
    std::cout << "max(s1,s2): " << ::max(s1,s2) << std::endl; 
} 

template <typename T> 
inline T const& max (T const& a, T const& b) 
{ 
     return a < b ? b : a; 
} 

내가이 프로그램을 컴파일

: 정확하게 오류가 무엇인지 말씀 해주십시오 nybody 수

CPP [78]> /opt/aCC/bin/aCC -AA 000001.cpp 
Error (future) 229: "/opt/aCC/include_std/string.cc", line 164 # "Ambiguous overloaded function call; a 
    function match was not found that was strictly best for ALL arguments. Two functions that matched 
    best for some arguments (but not all) were "const unsigned long &max<unsigned long>(const unsigned 
    long &,const unsigned long &)" ["000001.hpp", line 2] and "const unsigned long &std::max<unsigned 
    long>(const unsigned long &,const unsigned long &)" ["/opt/aCC/include_std/algorithm", line 1762]." 
    Choosing "const unsigned long &max<unsigned long>(const unsigned long &,const unsigned long &)" 
    ["000001.hpp", line 2] for resolving ambiguity. 
      _C_data = _C_getRep (max (_RW::__rw_new_capacity (0, this), 
           ^^^ 
Warning:  1 future errors were detected and ignored. Add a '+p' option to detect and fix them before they become fatal errors in a future release. Behavior of this ill-formed program is not guaranteed to match that of a well-formed program 

:

내가 아래에 오류가?

답변

1

게시 한 코드가 올바르게 컴파일되었으므로 "000001.hpp"안에 다른 잘못된 것이 있어야합니다. 해당 파일의 내용도 게시 할 수 있습니까?

편집 : avakar가 말했지만 문제가 지속되면 이는 컴파일러의 문제로 인한 것입니다. 뭔가에 max 기능을 이름 바꾸기 또는 네임 스페이스에 넣어 :

namespace Foo 
{ 
    template <typename T> 
    inline T const& max (T const& a, T const& b) 
    { 
     return a < b ? b : a; 
    } 
} 

int main() 
{ 
    int i = 42; 
    std::cout << "max(7,i): " << Foo::max(7,i) << std::endl; 

    double f1 = 3.4; 
    double f2 = -6.7; 
    std::cout << "max(f1,f2): " << Foo::max(f1,f2) << std::endl; 

    std::string s1 = "mathematics"; 
    std::string s2 = "math"; 
    std::cout << "max(s1,s2): " << Foo::max(s1,s2) << std::endl; 
} 
+0

이 해결 방법이 작동합니다. 하지만 max의 범위 분석 연산자를 유지하여 std :: max를 호출해서는 안됩니다.그럼에도 왜 오류가오고 있습니까? – Vijay

+0

이유는 avakar가 설명하는 이유입니다. "000001.hpp"헤더에'max'의 정의 만있는 것이 사실이라면 문제는 컴파일러가 전역 이름 공간에 몇 가지 표준 기호를 주입하는 것입니다. – Manuel

7

당신은 아마 대신 어딘가 <iostream><iostream.h> 포함되어 내가 생각할 수있는 두 가지 확실한 해결 방법이 있습니다. 전자는 당분간 존재하지 않았지만 호환성을 위해, 당신은 여전히 ​​포함 받아이 std::max 따라서 모호성의 결과로, 글로벌 네임 스페이스에 가져되도록

#include <iostream> 
using namespace std; 

으로 대체 컴파일러. <iostream.h><iostream>으로 바꾸거나 max의 이름을 바꾸면 문제가 사라집니다.

편집 : 당신은 분명히 포함을 수정했지만 아직 당신은 어딘가에 using namespace std;이있을 것입니다. 당신은 그걸 없앨 필요가 있어요. 실제로 using namespace을 전역 범위에서 사용하지 않아야합니다.

편집 : 어딘가에 using std::max이있을 수도 있습니다. 당신도 그것을 제거해야합니다.

::max 
std::max 

정말 이상한 것 같다, 당신이 어딘가에 또는 악화 using namespace std;을 가질 수 있음을 : 당신이 사용되지만 두 번째 오류는 다음과 같은 두 가지 기능이 충돌되어 있음을 알려줍니다 컴파일러 모르는

+0

그건 문제가 아니에요. VS2008과 GCC 4.1에서 테스트 한 네임 스페이스 std를 써도 코드는 잘 컴파일됩니다. – Manuel

+1

만약'std :: max'를 정의하는 도 포함하면 안된다. 오류 보고서를 자세히 읽으면 컴파일러가 사용자 헤더에 정의 된 '최대'와 '알고리즘'헤더에 정의 된 '최대'의 모호성을 처리하는 데 문제가 있음을 알 수 있습니다 (1762 줄에서 정확하게 설명). –

+0

그래도 버그가 아니어야합니까? ':: max' 이름은 표준에 예약되어 있지 않습니다. – MSalters

1

첫 번째 오류에서 언급 한대로 iostream.h을 사용하십시오. 컴파일러/툴체인 및 .hpp 파일의 내용에 대한 자세한 정보를 제공 할 수 있습니까?

0

그것은

max<unsigned long> 

두 가지 정의가 발견 된 것을 말한다. 한 정의는 000001.hpp에 있고 다른 정의는/opt/aCC/include_std/알고리즘에 있습니다. 컴파일러는 현재 000001.hpp에있는 것을 선택 했으므로 오류가 나타나지 않습니다. 그러나이 두 정의는 미래에 오류를 일으킬 수 있다고 말합니다.

0

이것이 문제의 원인인지는 모르겠지만 어쨌든; STL의 일부이므로 글로벌 (또는 로컬) 함수에 대해 max라는 이름을 사용하면 안됩니다.