如何定义要使用的功能?

时间:2012-09-17 18:43:37

标签: c++

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

如何定义我想使用哪个功能?

3 个答案:

答案 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_String8CL_String16CL_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();
}