2011-02-12 11 views
6

प्रकार का दायां हाथ ऑपरेंड लेता है। मैं पुनरावृत्त पैटर्न का उपयोग करके पुन: प्रयास करने और प्रिंट करने की कोशिश कर रहा हूं लेकिन मुझे एक एररइटरेटर पैटर्न - त्रुटि C2679: बाइनरी '<<': कोई ऑपरेटर नहीं मिला जो 'std :: string'

मिलता है

यहाँ त्रुटि है:

error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::string'  (or there is no acceptable conversion) 
1> could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>> (std::basic_ostream<_Elem,_Traits> &,const char *)' 
यहाँ

है जहां त्रुटि एसटीडी पर निकलती है :: अदालत < < menuItem-> getName();

#ifndef _ROBOT1_ 
#define _ROBOT1_ 

namespace guitars { 
namespace Composite { 
namespace InventoryParts { 
using namespace std; 
#include <iostream> 
//#include <string> 

class Robot1 { 

Menu* _partsMenu; 

private: 


public: Robot1(Menu* parts) : _partsMenu(parts) { assert(parts); 
} 
public: void printMenu() { 
    Iterator<MenuItem>* partsIterator = _partsMenu->createIterator(); 


    std::cout << "Parts List" << std::endl; 
    printMenu(partsIterator); 

} 
private: void printMenu(Iterator<MenuItem>* iterator) { assert(iterator); 
    while(iterator->hasNext()) { 
     MenuItem* menuItem = dynamic_cast< MenuItem* >(iterator->next()); 
     std::cout << menuItem->getName(); 
     std::cout << menuItem->getPrice() << " -- "; 
     std::cout << menuItem->getDescription() << std::endl; 
    } 
} 



}; 

} 
} 
} 

मैं किसी और इसके कहीं

#ifndef _ELECTRIC_MENU_ITERATOR_ 
#define _ELECTRIC_MENU_ITERATOR_ 
#include "Iterator.h" 

namespace guitars { 
namespace Composite { 
namespace InventoryParts { 


class ElectricMenuIterator : public Iterator<MenuItem> { 
private: mutable std::vector< MenuItem* > _items; 
private: mutable MenuItem* _position; 


public: explicit ElectricMenuIterator(std::vector< MenuItem* > items) : 
    _items(items) { 
    _position = *items.begin(); 
} 
public: MenuItem* next() const { 
    return _position; 
} 
public: bool hasNext() const { 
    for(std::vector< MenuItem* >::iterator iterator = _items.begin(); iterator != _items.end(); iterator++) { 
     if(*iterator == _position) { 
      if(++iterator != _items.end()) { 
       _position = *iterator; 
       return true; 
      } 
      else 
       return false; 
     } 
    } 
    return false; 
} 
}; 

} 
} 
} 

#endif 

इटरेटर

#ifndef _ITERATOR_ 
#define _ITERATOR_ 

namespace guitars { 
namespace Composite { 
namespace InventoryParts { 

template <class T> 
class Iterator 
{ 

public: 

virtual bool hasNext() const = 0; 
virtual T* next() const = 0; 
virtual ~Iterator() = 0 { 
} 


}; 
} 
} 
} 
#endif 

मेनू

#ifndef _MENU_ 
#define _MENU_ 

#include "MenuComponent.h" 
#include "InventoryItem.h" 
#include "Iterator.h" 
#include <assert.h> 
#include <vector> 
#include "MenuItem.h" 


namespace guitars { 
namespace Composite { 
namespace InventoryParts { 


class Menu : public MenuComponent { 

private: 


public: 

    virtual Iterator<MenuItem>* createIterator() const = 0; 
    virtual ~Menu() = 0 { 
} 

}; 

} 
} 
} 

और इलेक्ट्रिक गिटार मेनू बैठाना अधिक फ़ाइलों को शामिल करेगा

#ifndef _ELECTRIC_MENU_ 
#define _ELECTRIC_MENU_ 
#include "Menu.h" 
#include "MenuItem.h" 
#include "ElectricMenuIterator.h" 

namespace guitars { 
namespace Composite { 
namespace InventoryParts { 

class ElectricMenu : public Menu { 



private: 
std::vector< MenuItem* > _menuItems; 



public: ElectricMenu() { 
    addItem("Electric Guitar","comes with an assortment of goodies",542.99); 
    //addItem("Regular acoustic","standard style",false,245.99); 

} 
public: void addItem(std::string name, std::string description, double price) { 
    MenuItem* menuItem = new MenuItem(name, description, price); 
    _menuItems.push_back(menuItem); 
} 
public: std::vector< MenuItem* > getMenuItems() const { 
    return _menuItems; 
} 
public: Iterator<MenuItem>* createIterator() const { 
    return dynamic_cast<Iterator<MenuItem>* > (new ElectricMenuIterator(_menuItems)); 
} 

}; 

} 
} 
} 

#endif 

कृपया मुझे स्वरूपण

उत्तर

9
//#include <string> 

आप <string> हैडर शामिल नहीं कर रहे के लिए माफ कर दीजिए। आपने निर्देश शामिल करने पर टिप्पणी की है।

विजुअल C++ स्टैंडर्ड लाइब्रेरी कार्यान्वयन में, std::string इस्तेमाल किया जा सकता है जब आप <iostream> शामिल हैं, लेकिन operator<< अधिभार है कि एक std::ostream में एक std::string की प्रविष्टि की अनुमति देता है केवल शामिल किया गया है अगर आप वास्तविक <string> हैडर शामिल हैं।

यदि आप चाहते हैं कि आपका कोड पोर्टेबल हो, तो आपको <string>std::string का उपयोग करने के लिए अवश्य शामिल करना होगा; कौन सा मानक लाइब्रेरी हेडर अन्य शीर्षकों द्वारा शामिल किया गया है कार्यान्वयन-परिभाषित है।

+0

जब मैं स्ट्रिंग शामिल मैं मिल बंद त्रुटियों charater को menuItem- बदलने का प्रयास करें> getName() और menuItem-> getDescription ..इसलिए मैंने इसे –

+0

@icelated क्यों टिप्पणी की: ठीक है, अगर आप 'std :: string' का उपयोग करना चाहते हैं, तो आपको' 'हेडर शामिल करना होगा ... यदि आपको ऐसा करने पर त्रुटियां मिल रही हैं तो आपको आवश्यकता है उन त्रुटियों से निपटने के लिए। –

+0

मुझे त्रुटि C2039 जैसी त्रुटियां मिलती हैं: 'cout': 'guitars :: composite :: inventoryParts :: std या' endl 'का सदस्य नहीं है:' गिटार :: समग्र :: इन्वेंटरीपार्ट्स :: std 'का सदस्य नहीं है –

0

यह एक अनुमान है, लेकिन मैं

while(iterator->hasNext()) { 
    MenuItem* menuItem = dynamic_cast< MenuItem* >(iterator->next()); 
    std::cout << menuItem->getName(); 
    std::cout << menuItem->getPrice() << " -- "; 
    std::cout << menuItem->getDescription() << std::endl; 
} 

देखेंगे सरणियों एक गुच्छा

संबंधित मुद्दे