-1

次のコンパイラ エラーを解決するにはどうすればよいですか。

xstddef(180): error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)
          tuple(572): could be 'bool std::operator <(const std::tuple<> &,const std::tuple<> &)'
          while trying to match the argument list '(const std::string, const std::string)'
          xstddef(179) : while compiling class template member function 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const'
          with
          [
              _Ty=std::string
          ]
          map(177) : see reference to function template instantiation 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const' being compiled
          with
          [
              _Ty=std::string
          ]
          type_traits(743) : see reference to class template instantiation 'std::less<_Ty>' being compiled
          with
          [
              _Ty=std::string
          ]
          xtree(1028) : see reference to class template instantiation 'std::is_empty<_Ty>' being compiled
          with
          [
              _Ty=std::less<std::string>
          ]
          map(67) : see reference to class template instantiation 'std::_Tree<_Traits>' being compiled
          with
          [
              _Traits=std::_Tmap_traits<std::string,IDispatcherPtr,std::less<std::string>,std::allocator<std::pair<const std::string,IDispatcherPtr>>,false>
          ]
          main.cpp(506) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled
          with
          [
              _Kty=std::string,
              _Ty=IDispatcherPtr
          ]

次のコードの場合:

class IDispatcher
{
    virtual void operator()() = 0;
};

class AlarmDispatcher: public IDispatcher
{
    virtual void operator()()
    {
    }
};

typedef boost::shared_ptr<IDispatcher> IDispatcherPtr;

int main()
{
    std::map<std::string, IDispatcherPtr> dispatchers;
    dispatchers["alarm"] = boost::make_shared<AlarmDispatcher>();
4

2 に答える 2

5

最初の問題:

必要なすべてのヘッダーを明示的に含める必要があり、他のヘッダーを含めることで間接的に含まれていることに依存しないでください。

#include <string> // <== IN PARTICULAR THIS ONE
#include <map>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

コメントから判断するとクラスが定義されているヘッダーで<string.h>はなく、ヘッダー (標準 C ライブラリのヘッダー) が含まれているようです。<string>std::string

2番目の問題:

クラス間の継承関係を確立するのを忘れました:

class AlarmDispatcher : public IDispatcher
//                    ^^^^^^^^
{
    virtual void operator()()
    {
    }
};
于 2013-05-17T11:05:48.057 に答える
0

将来この問題が発生する人のために: 関数定義の最後に const を追加することで解決しました。これは、クラスを c++ std マップ コレクションのキーとして利用可能にするために使用していました。

bool operator <(const ThisClass& otherInstance)

になります:

bool operator <(const ThisClass& otherInstance) const
于 2016-08-11T04:51:15.527 に答える