0

已解决:重新启动 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));
4

2 回答 2

2

您需要将复制构造函数参数设为 const

GroceryStoreItem::GroceryStoreItem(const GroceryStoreItem& GroceryStoreItemCCIn)       

此外,通常最好在复制构造函数中使用初始化而不是赋值

GroceryStoreItem::GroceryStoreItem(const GroceryStoreItem& rhs) :
    ItemName(rhs.ItemName),
    Location(rhs.Location),
    Cost(rhs.Cost)
{
}

最后(这是最重要的一课),因为您做了正确的事情并std::string在课堂内部使用,您实际上根本不需要复制构造函数。编译器生成的默认值无论如何都会做正确的事情。所以我实际上会删除你的复制构造函数,这也将修复错误。

您的赋值运算符的相同参数,也删除它。

于 2013-05-04T05:40:35.760 回答
1

我关闭了 Visual Studio,开始了一个新项目并将我的 CPP 和标头粘贴到新项目中,它编译并运行。不是理想的答案,但它有效。

于 2014-12-04T18:41:41.497 回答