注意:我还是c ++的新手,虽然这可能是一个简单的问题,但我无法找到解决方案。
目的:
我想将一个空字符串(就像在java / C#中一样)传递给我的构造函数。我收到一个错误:
error: no matching function for call to 'ReturnObject::ReturnObject(ResultCode::ClientCode, const char [1])'
return new ReturnObject(ResultCode::ClientCode::enum_FailedOpeningClientSocket, "");
ReturnObject
的目的是封装enum
和string
。
这个错误意味着什么,我该如何解决?
我尝试将构造函数参数从QString data
更改为char data
并使用''
进行调用,但这导致错误empty character constant
。
致电代码:
return new ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "");
标题
class ReturnObject
{
public:
ReturnObject(ResultCode enum_code, QString data);
QString getData();
ResultCode getCode();
private:
ResultCode e_code;
QString data_string;
};
实施
#include "returnobject.h"
ReturnObject::ReturnObject(){
data_string="WARN";
}
ReturnObject::ReturnObject(ResultCode enum_code, QString data)
: e_code(enum_code)
, data_string(data)
{}
ResultCode ReturnObject::getCode()
{
return e_code;
}
QString ReturnObject::getData()
{
return data_string;
}
感谢 wasthishelpful 和一些评论,我做了一个悲剧性的逻辑错误让我看错了参数,解决方法是我应该投出我的枚举类ResultCode
这是嵌套class
es之一的父类,在本例中为ClientCode
,如下面的enum类标题所示
enum.h
#ifndef ENUMS_H
#define ENUMS_H
class ResultCode{
public:
enum class LoginDialogCode{
enum_LoginSuccess=0,
enum_InternetOffline=1,
enum_ServerOffline=2,
enum_InvalidLoginPass=3,
enum_EmptyLoginPass=4,
enum_FailedRetreivingServerList=5,
enum_TokenFailed=6
};
enum class ClientCode{
enum_SentSuccess=10,
enum_FailedOpeningClientSocket=11,
enum_FailedClientSocketConnection=12,
enum_FailedWritingtoClientSocket=13,
enum_FailedReadingfromClientSocket=14
};
enum class ServerCode{
enum_ReceivedSuccess=20,
enum_FailedOpeningListenSocket=21,
enum_FailedBindingtoListenSocket=22,
enum_FailedAcceptingListenSocket=23,
enum_FailedWritingtoListenSocket=24,
enum_FailedReadingfromListenSocket=25
};
};
#endif // ENUMS_H
答案 0 :(得分:2)
您的错误不是第二个,而是第一个参数。从你的问题,我猜你有这样的代码:
struct ReturnCode
{
enum class ClientCode
{
enum_FailedSocketConnection,
// other values
};
};
所以你最终得到了两种声明的类型:ReturnCode
和ReturnCode::ClientCode
。查看构造函数声明:
`ReturnObject::ReturnObject(ResultCode enum_code, QString data)`
在查看通话时,它需要ReturnCode
类型的对象作为第一个参数:
ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "")
您传递ReturnCode::ClientCode
类型的对象作为第一个参数。
您可以像这样更改代码:
class ReturnObject
{
public:
ReturnObject(ResultCode::ClientCode enum_code, QString data);
QString getData();
ResultCode::ClientCode getCode();
private:
ResultCode::ClientCode e_code;
QString data_string;
};
一旦你来到这里。您可以考虑从ResultCode
中取出枚举:
enum class ClientCode
{
enum_FailedSocketConnection,
// other values
};
class ReturnObject
{
public:
ReturnObject(ClientCode enum_code, QString data);
QString getData();
ClientCode getCode();
private:
ClientCode e_code;
QString data_string;
};
这遵循Zen of Python:" Flat优于嵌套"。恕我直言,这在C ++中也是如此。
修改强>
根据您的评论,我们来XY problem,您的代码需要重新设计。这是第一个主张:
#include <type_traits>
enum class ClientCode{
// ...
enum_FailedClientSocketConnection=12,
// ...
};
template<typename T>
struct ReturnObject
{
static_assert(std::is_enum<T>::value, "T should be an enum");
const T e_code;
const QString data_string;
};
template<typename T>
ReturnObject<T> make_return_object(T e_code, std::string data_string)
{
return ReturnObject<T>{e_code, data_string};
}
// usage
return make_return_object(
ClientCode::enum_FailedClientSocketConnection, ""
);
我为公共const成员删除了访问器getData
和getCode
:它们只是被读取,并且不应该为给定的返回对象更改,所以让它们公开,使用const限定符来防止修改
我使用模板来表示代码,使用static_assert
来检查给定类型是否为枚举。
缺点是:
make_return_object
将为每个不同的枚举返回不同的类型。