1

我对 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>&}’

如何定义我要使用的功能之一?

4

3 回答 3

2

根据文档,函数“get_hour()”等返回一个无符号字符,这反过来意味着没有一个函数模板与您的调用匹配。

就像这个功能是为苹果、樱桃或香蕉而设计的,而你给它的是梨。

为了解决你的问题,我建议要么使用 C-Function 'sprintf',然后通过 CL_String8-Function 运行它......或者使用 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。

于 2012-09-17T18:52:41.613 回答
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_String8CL_String16内部。CL_String8不是您需要在代码中显式使用的东西。

于 2012-09-17T19:06:57.790 回答
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();
}
于 2012-09-17T18:54:00.933 回答