2

コンパイルしようとしている単一のソース ファイル C++ プログラムがあります。

ヘッダー ファイルは次のようになります。

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

ソースファイルは次のようになります。

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

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

コンパイルしようとしています: g++ merge.cpp -o 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> >’

何が問題なのですか?

4

2 に答える 2

4

あなたが持っているクラス宣言で

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

しかし、コンストラクターの定義を提供すると、

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

もちろん、両者は一致しなければなりません。

また、using namespace std;コードのどこかにステートメントがあるようです。コンパイラは、 への呼び出しがクラス コンストラクターmergeへの呼び出しか、 への呼び出しかを解決できません。mergestd::merge

これから学ぶべき教訓(コンストラクターを修正する以外):

コードのusing namespace std; どこにも追加しないでください。std::入力するのはそれほど面倒ではありません。

于 2012-10-19T21:02:14.577 に答える
3

マージのコンストラクターの署名がその定義と一致しません。

クラス宣言では、 oneと other のmerge::merge2 つのパラメーターを受け取るように定義しました。ただし、の定義では、型のパラメーターを 1 つだけ受け取るように定義します。intchar*merge::mergemap<string,string>&

于 2012-10-19T20:56:38.663 に答える