重载函数的调用不明确 - std::to_string

14

我尝试将整数值插入字符串中,当我发现std::to_string时,我以为我的问题得到了解决,但是每当我尝试实际使用它时,Visual Studio就会抱怨模糊性。这是我的函数的当前版本:

string get_time_remaining (int elapsed)
{
    string remaining;
    string temp_string;

    int time_remaining = TimeLimit - elapsed;

    int temp_int;

    temp_int = int(time_remaining / 3600);

    if(temp_int == 0)
        remaining = "00 : ";
    else
    {
        temp_string = std::to_string(temp_int);   // Here!
        remaining = temp_string + " : ";
    }

    temp_int = time_remaining % 60 + 1;

    if(temp_int < 10)
        remaining = remaining + "0";

    temp_string = std::to_string(temp_int);

    remaining = remaining + temp_string;

    return remaining;
}

我尝试在调用to_string函数时将temp_int转换为字符串,如您所见,我甚至尝试将应该是整数除法的结果进行强制类型转换,但无论我做什么,VS都会向我报告以下错误:

d:\my programs\powerplay\powerplay\powerplay.cpp(1285): error C2668: 'std::to_string' : ambiguous call to overloaded function
1>          d:\microsoft visual studio 10.0\vc\include\string(688): could be 'std::string std::to_string(long double)'
1>          d:\microsoft visual studio 10.0\vc\include\string(680): or       'std::string std::to_string(_ULonglong)'
1>          d:\microsoft visual studio 10.0\vc\include\string(672): or       'std::string std::to_string(_Longlong)'

非常感谢您的帮助。


我还应该指出第二次调用to_string也存在匹配错误,因此它不仅限于一个调用。 - ShenDraeg
2个回答

25

MSVC11缺少std::to_string的正确重载,因此您必须对unsigned long longlong long进行static_cast

请注意,此漏洞已在2012年11月的CTP中修复。您可以在这里获取。


1
非常感谢。将其转换为“not-int”使得它能够编译。当我可以这样做时,我将在2分钟内将其标记为答案。 - ShenDraeg
1
请注意,这个错误已经在2012年11月的CTP中得到修复。它应该已经在普通的VS 2012中得到修复,特别是因为11月的CTP根本没有带来任何库的更改。这也使得你对他的问题标记为visual-studio-2012无效,因为从他的编译器输出可以看出,他显然使用的是2010。 - Christian Rau
@ChristianRau 谢谢您发现了这个问题——但是在我没有安装 November CTP 的 VS2012 中,我也遇到了同样的重载问题,因此可能是我的混淆。 - Rapptz
1
@Rapptz 对我来说没有 Nov CTP 也能正常工作。也许你是在使用某个预发布的 VS 2012 beta 版本? - Christian Rau
包含实际代码将非常有用。 - user2261062

3
temp_int是一个int值,而Visual Studio似乎只检测接收doublelong longunsigned long long值的重载,因此它不知道使用哪个重载,导致歧义(尽管将整数强制转换为长整数值似乎是直观的)。
要么将temp_int声明为long long,要么在调用函数时进行强制转换。

这是“unsigned long long”和“long long”,而不是“long”。 - Rapptz
而且它是“long double”,而不是“double”。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接