我是C ++的新手,我在ClanLib中遇到CL_String8函数错误。
当我尝试编译时:
CL_String now() {
CL_DateTime now = CL_DateTime::get_current_local_time();
return CL_String8(now.get_hour()) + " " + CL_String8(now.get_minutes()) + " " + CL_String8(now.get_seconds());
}
我收到此错误(重复3次):
src/utils.cpp: In function ‘CL_String now()’:
src/utils.cpp:15:34: error: call of overloaded ‘CL_String8(unsigned char)’ is ambiguous
src/utils.cpp:15:34: note: candidates are:
/usr/include/ClanLib-2.3/ClanLib/Core/Text/string8.h:74:2: note: CL_String8::CL_String8(const wchar_t*) <near match>
/usr/include/ClanLib-2.3/ClanLib/Core/Text/string8.h:74:2: note: no known conversion for argument 1 from ‘unsigned char’ to ‘const wchar_t*’
/usr/include/ClanLib-2.3/ClanLib/Core/Text/string8.h:63:2: note: CL_String8::CL_String8(const char*) <near match>
/usr/include/ClanLib-2.3/ClanLib/Core/Text/string8.h:63:2: note: no known conversion for argument 1 from ‘unsigned char’ to ‘const char*’
/usr/include/ClanLib-2.3/ClanLib/Core/Text/string8.h:55:2: note: CL_String8::CL_String8(const CL_String8&) <near match>
/usr/include/ClanLib-2.3/ClanLib/Core/Text/string8.h:55:2: note: no known conversion for argument 1 from ‘unsigned char’ to ‘const CL_String8&’
/usr/include/ClanLib-2.3/ClanLib/Core/Text/string8.h:50:2: note: CL_String8::CL_String8(const string&) <near match>
/usr/include/ClanLib-2.3/ClanLib/Core/Text/string8.h:50:2: note: no known conversion for argument 1 from ‘unsigned char’ to ‘const string& {aka const std::basic_string<char>&}’
如何定义我想使用哪个功能?
答案 0 :(得分:2)
根据文档,函数'get_hour()'等返回一个无符号字符,这反过来意味着没有任何函数模板符合您的调用。
这就像苹果,樱桃或香蕉的功能一样,你给它的是梨。
为解决您的问题,我建议使用C-Function'sprintf',并通过CL_String8-Function运行THAT ......或使用std :: string。
使用sprintf的解决方案:
#include <stdio.h>
char Buffer[50];
sprintf(Buffer, "%02d %02d %02d", now.get_hour(), now.get_minutes(), now.get_seconds());
return CL_String8(Buffer);
这将以hh:mm:ss格式返回数据,对于低于9的所有值,返回0。
答案 1 :(得分:2)
ClanLib具有格式化功能,可用于避免低级C格式化代码:
CL_DateTime now = CL_DateTime::get_current_local_time();
return cl_format("%1 %2 %3", now.get_hour(), now.get_minutes(), now.get_seconds());
cl_format
会自动接受大多数基本类型。
其次,CL_DateTime
有一个to_long_time_string()
,它将时间作为 hh:mm:ss 返回,所以你可以使用它,除非你需要特定的格式:
return now.to_long_time_string();
第三,没有必要直接使用CL_String8
。根据unicode编译设置,CL_String
将在内部使用CL_String8
或CL_String16
。 CL_String8
不是您需要在代码中明确使用的内容。
答案 2 :(得分:1)
now.get_minutes()等正在重新使用无符号字符,我确信CL_String8没有任何带有这样参数的重载版本。
在将值传递给CL_String8
之前,将值传递给此函数#include <sstream>
#include <string> // not sure if necessary
const char* unsignedChar2string(unsigned char c) {
stringstream stream;
stream << static_cast<char>(c); // I'm not 100% sure if the cast is necessary
// I'm also not sure whether it should be static, dynamic, or reinterpret.
return stream.str().c_str();
}