2012-10-19 2 views
2

저는 컴파일하려고하는 단일 소스 파일 C++ 프로그램이 있습니다. g ++ merge.cpp -o 내가 할C++ 컴파일 오류 : 생성자에 대한 참조가 모호합니다.

병합 :

int main(int argc, char* argv[]) 
{ 
merge mrg(argc,argv); 
return 0; 
} 

merge::merge(map<string,string>& params) { 
    //code 
} 

가 컴파일하려고 : 같은 소스 파일이 보이는

class merge { 
public: 
explicit merge(int argc, char* argv[]); 
virtual ~merge(); 
}; 

그리고 : 같은

헤더 파일이 보인다 :

merge.cpp: In function ‘int main(int, char**)’: 
    merge.cpp:10: error: reference to ‘merge’ is ambiguous 
    merge.h:12: error: candidates are: class merge 
    /usr/lib/gcc/x86_64-redhat-   linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:3180: error: template<class  _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>  _OutputIterator std::merge(_InputIterator1, _InputIterator1, _InputIterator2,  _InputIterator2, _OutputIterator, _Compare) 
    /usr/lib/gcc/x86_64-redhat- linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:3122: error: template<class  _InputIterator1, class _InputIterator2, class _OutputIterator> _OutputIterator  std::merge(_InputIterator1, _InputIterator1, _InputIterator2, _InputIterator2,  _OutputIterator) 
    merge.cpp:10: error: reference to ‘merge’ is ambiguous 
    merge.h:12: error: candidates are: class merge 
    /usr/lib/gcc/x86_64-redhat- linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:3180: error: template<class  _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>  _OutputIterator std::merge(_InputIterator1, _InputIterator1, _InputIterator2,  _InputIterator2, _OutputIterator, _Compare) 
    /usr/lib/gcc/x86_64-redhat- linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:3122: error: template<class  _InputIterator1, class _InputIterator2, class _OutputIterator> _OutputIterator  std::merge(_InputIterator1, _InputIterator1, _InputIterator2, _InputIterator2,  _OutputIterator) 
    merge.cpp:10: error: expected `;' before ‘mrg’ 
    merge.cpp: At global scope: 
    merge.cpp:14: error: prototype for ‘merge::merge(std::map<std::basic_string<char,  std::char_traits<char>, std::allocator<char> >, std::basic_string<char,  std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char,  std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const  std::basic_string<char, std::char_traits<char>, std::allocator<char> >,  std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&)’ does not  match any in class ‘merge’ 
    merge.h:12: error: candidates are: merge::merge(const merge&) 
    merge.h:14: error:     merge::merge(int, char**) 
    merge.cpp: In constructor ‘merge::merge(std::map<std::basic_string<char,  std::char_traits<char>, std::allocator<char> >, std::basic_string<char,  std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char,  std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const  std::basic_string<char, std::char_traits<char>, std::allocator<char> >,  std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&)’: 
    merge.cpp:15: error: declaration of ‘std::map<std::basic_string<char,  std::char_traits<char>, std::allocator<char> >, std::basic_string<char,  std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char,  std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const  std::basic_string<char, std::char_traits<char>, std::allocator<char> >,  std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > params’  shadows a parameter 
    merge.cpp:16: error: ‘argc’ was not declared in this scope 
    merge.cpp:16: error: ‘argv’ was not declared in this scope 
    /usr/lib/gcc/x86_64-redhat- linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h: At global scope: 
    /usr/lib/gcc/x86_64-redhat- linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h: In instantiation  of ‘std::iterator_traits<std::basic_string<char, std::char_traits<char>,  std::allocator<char> > >’: 
    /usr/lib/gcc/x86_64-redhat- linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:803: instantiated from ‘void  std::vector<_Tp, _Alloc>::_M_initialize_dispatch(_InputIterator, _InputIterator,  __false_type) [with _InputIterator = std::basic_string<char, std::char_traits<char>,  std::allocator<char> >, _Tp = int, _Alloc = std::allocator<int>]’ 
    /usr/lib/gcc/x86_64-redhat- linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:262: instantiated from  ‘std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const _Alloc&) [with  _InputIterator = std::basic_string<char, std::char_traits<char>, std::allocator<char> >,  _Tp = int, _Alloc = std::allocator<int>]’ 
    merge.cpp:86: instantiated from here 
    /usr/lib/gcc/x86_64-redhat- linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:129: error: no  type named ‘iterator_category’ in ‘struct std::basic_string<char, std::char_traits<char>,  std::allocator<char> >’ 

무엇이 잘못 되었습니까?

+0

은 분명히, 당신은 당신의 코드에서 일부 표준 라이브러리 헤더를 포함하고, 혼란'표준 : merge' 기능이있다 이름 검색. 아마 당신은'namespace std 사용하기 '를 포함 시켰습니까? 컴파일하는 정확한 소스를 볼 수 없으므로 (표시하는 코드에 10 행이 없습니다!) 쉽게 추측 할 수 없으며 추측 할 필요도 없습니다. –

답변

3

병합의 생성자 서명이 해당 정의와 일치하지 않습니다.

클래스 선언에 merge::merge을 정의하여 intchar*의 두 매개 변수를 가져 왔습니다. merge::merge에 대한 정의, 그러나, 당신은 당신이

explicit merge(int argc, char* argv[]); 

이 클래스 선언에서 유형 map<string,string>&

4

의 하나의 매개 변수에 복용로 정의하지만 생성자에 대한 정의를 제공 할 때 당신은

merge::merge(map<string,string>& params) { /* ... */ } 

물론 두 개가 일치해야합니다.

또한 코드에 어딘가에 using namespace std; 문이있는 것으로 보입니다. 컴파일러는 merge에 대한 호출이 merge 클래스 생성자에 있는지 여부 또는 std::merge에 있는지 여부를 확인할 수 없습니다.

(생성자를 수정 이외의)이 멀리 취할 교훈 :

DO NOT add using namespace std;anywhere in your code. std:: is not very cumbersome to type.

+0

둘째, 네임 스페이스 std를 사용하여 "코드의 아무 곳에 나"추가하지 마십시오. 적어도 제 의견으로는'std ::'를 쓰면 코드가 훨씬 더 명확 해집니다. –

+0

@BeyondSora는 이제는'std'를 잘 해주지 만 누군가가'std'에 익숙하지 않고'std' 클래스 나 함수와 같은 이름을 가진 클래스와 함수를 선언하면 다음과 같은 몇 가지 이상한 오류가 발생합니다 이것과 옆에'std'의 장래 버전으로 코드를 컴파일하고 싶다면'std'가 당신과 같은 이름의 클래스 나 함수를 추가 할 수 있고 코드가 컴파일되지 않을 것이기 때문에 그렇게 할 수 없습니다. 그래서'std ::'로 불편 해한다는 느낌이 든다면, 예를 들어'std :: cout'을 사용하십시오. – BigBoss

+1

@ user1701545 AFAIK in C++'explicit'은 암시 적 변환을 피하기 위해 하나의 인수만을 취하는 생성자에 적용됩니다 'merge' 생성자와 같은 하나 이상의 인수를 취하는 생성자는 암시 적 일 수 없으므로 결코 '명시 적'일 필요가 없습니다! – BigBoss