Заводской шаблон: iostream против строки - PullRequest
0 голосов
/ 29 марта 2019

Ошибка компиляции шаблона без включения заголовка "string", даже если я добавлю заголовок "iostream"!

//----------------------------------------------------------
// Header : Factory.h
//----------------------------------------------------------
template <typename TKey, typename TObject>
class Factory
{
public :
    std::map<TKey, TObject*> m_mapReference;
    void Register(TKey key,TObject *obj){
        if(m_mapReference.find(key)==m_mapReference.end())
            m_mapReference[key]=obj;
    }
};

class A
{ };

class B : public A
{ };

//----------------------------------------------------------
// Main.cpp
//----------------------------------------------------------
#include <iostream>
//#include <string>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    string strType = "B";
    B b;
    Factory< string, A > fact;
    fact.Register(strType, &b);
}

vc \ include \ xfunctional (125): ошибка C2784: 'bool std :: operator <(const std :: _ Hash <_Traits> &, const std :: _ Hash <_Traits> &)': невозможно определить тип аргумента для const std :: _ Hash <_Traits> & 'partir de' const std :: string '

1 Ответ

0 голосов
/ 02 апреля 2019

Я думаю, что вы обнаружили "случайное включение". Реализация нуждалась в некоторой функциональности std :: string, которую необходимо включить, и поэтому определение std :: string видно «случайно».

Вы не должны полагаться на такие случайные включения, хотя нет никакого способа узнать наверняка, что вы этого не сделали. Вполне может быть, что на другой платформе, или в другой реализации стандартной библиотеки, или даже просто в новой версии стандартной библиотеки, которая больше не нужна или не включена.

...