VS 2017 C ++编译器无法在VS 2005中找到匹配的功能

时间:2018-08-10 14:54:31

标签: c++ visual-studio-2017

我得到了

  

在这种情况下,“错误C3861:'to8Bit':找不到标识符”

typedef struct _ustruct2
{
    int which;
    union 
    {
        double d;
        tstring  * s;
        bool b;
        char e;
    } uu;
} ustruct2;

std::string  to8Bit(const std::string &s);
std::string  to8Bit(const std::string s);
std::string  to8Bit(const tstring s);
std::string  to8Bit(tstring s);
std::string  to8Bit(tstring &s);
std::string  to8Bit(wchar_t * pc);
std::string  to8Bit(const tstring &s);
std::string  to8Bit(const char * pc, int len = -1);
std::string  to8Bit(const wchar_t * pc, int len = -1);

static void outputustruct(FILE * opmte, int i, const char * s, const ustruct2 &u)
{
    std::string mys2 = to8Bit((*u.uu.s).c_str());
}

本文认为我不需要其他to8BIT的其他版本。但是我本以为其中之一会匹配。我试过在函数outputustruct函数头中删除const和/或与号,并在删除与号时在对to8Bit的调用中删除星号。我已经尝试在结构定义和带有错误的代码中使用string和tstring,但是我没有做任何事情来编译它。

此代码在VS 2005中工作正常,但在VS 2017中工作不正常。以我的经验,MS严格限制了以后版本中的编译器以更严格地符合标准,但是我看不到是什么原因导致了编译器错误。

1 个答案:

答案 0 :(得分:0)

C ++ 11 std::wstring_convert(在C ++ 17中已弃用)提供了一种简单的解决方案:

在您的情况下,tstring定义为:

#include <tchar.h> // For _TCHAR

typedef std::basic_string<_TCHAR> tstring;

可以这样转换:

#include <locale>
#include <codecvt>

int main()
{
    tstring string_to_convert = L"Follow the white rabbit";

    // Converter setup:
    using convert_type = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_type, wchar_t> converter;

    // Convert (.to_bytes: wstr->str, .from_bytes: str->wstr)
    std::string converted_str = converter.to_bytes(string_to_convert);

    return 0;
}

或者您的情况,例如:

#include <locale>
#include <codecvt>

static void outputustruct(FILE * opmte, int i, const char * s, const ustruct2 &u)
{
    // Converter setup:
    using convert_type = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_type, wchar_t> converter;

    // Convert:
    string mys2 = converter.to_bytes(*u.uu.s);
}

(在VS2017 C ++上有效)