c++ - Visual Studio 2010 列表复制构造抛出 C2664 错误

标签 c++ visual-studio-2010 visual-c++

已解决:重新启动 Visual Studio

我正在为学校开展一个涉及 STL 列表的项目。并通过 xmemory 获取此错误。此时我正试图构建解决方案,但xmemory 正在杀死我

Error 1 error C2664: 'GroceryStoreItem::GroceryStoreItem(GroceryStoreItem &)' : cannot convert parameter 1 from 'std::string' to '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));

最佳答案

你需要让你的复制构造函数参数为const

GroceryStoreItem::GroceryStoreItem(const GroceryStoreItem& GroceryStoreItemCCIn)       

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

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

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

赋值运算符的参数相同,也将其删除。

关于c++ - Visual Studio 2010 列表复制构造抛出 C2664 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16370917/

相关文章:

c++ - Visual C++ 函数突然慢了 170 毫秒(长了 4 倍)

c++ - 使用 g++ 构建用于 MSVC 应用程序的 dll

c++ - 我们是否需要在 C++ 中进行矢量化,或者 for 循环是否已经足够快?

c++ - 如何从源代码或库中替换 __ieee754_exp_avx 调用?

c# - 是否有可能在 VS 2010 中将 C# 应用程序的发布版本设置为 "debug"

c++ - Visual Studio - 在 Visual Studio 之外运行项目

c++ - 稀疏矩阵加法条件

c++ - Visual Studio 显示错误的 SEH 异常位置

javascript - 在 DropDownList SelectedIndexChanged 事件上调用 JavaScript 函数 :

c++ - C++ 编译器如何设法发出完全没有意义的代码?