已解决:重新启动Visual Studio
我正在为一个涉及STL
列表的学校项目工作。并使用xmemory
收到此错误。我只是想在此时构建解决方案,但xmemory
正在杀了我
错误1错误C2664:'GroceryStoreItem :: GroceryStoreItem(GroceryStoreItem&)':无法将参数1从'std :: string'转换为'GroceryStoreItem&' d:\ microsoft visual studio 10.0 \ vc \ include \ xmemory 208
这是我的标题
#include <string>
#include <sstream>
#include<iostream>
#include <iterator>
#include <list>
using namespace std;
//
//*****************************************************************
// USER DEFINED DATA TYPES
//
class GroceryStoreItem
{
friend ostream & operator<< (ostream &out, const GroceryStoreItem &RHS);
public:
GroceryStoreItem();
GroceryStoreItem(string Name, double cost, string location);
GroceryStoreItem(GroceryStoreItem & GroceryStoreItemCCIn);
GroceryStoreItem & operator= (const GroceryStoreItem &RHS);
string ReturnItemName();
string ReturnLocation();
double ReturnCost();
private:
string ItemName;
string Location;
double Cost;
};
和实施
#include "Grocery_Item.h"
using namespace std;
//*****************************************************************
// Grocery Item Constructors
//*****************************************************************
GroceryStoreItem::GroceryStoreItem()
{
ItemName = "default";
Location = "aisle 1";
Cost = 0.0;
}
GroceryStoreItem::GroceryStoreItem(string InName, double InCost, string InLocation)
{
ItemName = InName;
Location = InLocation;
if(InCost >= 0.0f)
{
Cost = InCost;
}
else
{
Cost = 0.0f;
}
}
GroceryStoreItem::GroceryStoreItem(GroceryStoreItem & GroceryStoreItemCCIn) //Copy Constructor
{
ItemName=GroceryStoreItemCCIn.ItemName;
Location=GroceryStoreItemCCIn.Location;
Cost=GroceryStoreItemCCIn.Cost;
}
编辑
的最后一行出现xmemory
错误
template<class _Other>
void construct(pointer _Ptr, _Other&& _Val)
{ // construct object at _Ptr with value _Val
::new ((void _FARQ *)_Ptr) _Ty(_STD forward<_Other>(_Val));
答案 0 :(得分:2)
您需要创建复制构造函数参数const
GroceryStoreItem::GroceryStoreItem(const GroceryStoreItem& GroceryStoreItemCCIn)
通常,在复制构造函数
中使用初始化而不是赋值通常更好GroceryStoreItem::GroceryStoreItem(const GroceryStoreItem& rhs) :
ItemName(rhs.ItemName),
Location(rhs.Location),
Cost(rhs.Cost)
{
}
最后(这是所有课程中最重要的一课),因为你做了正确的事情并在你的课程内部使用了std::string
,你根本不需要复制构造函数。无论如何,编译器生成的默认值都会做正确的事情。所以我实际上会删除你的拷贝构造函数,这也将修复错误。
您的赋值运算符的相同参数,也删除它。
答案 1 :(得分:1)
我关闭了Visual Studio,启动了一个新项目并将我的CPP和Headers粘贴到新项目中,并进行了编译和工作。不是理想的答案,但它确实有效。