我试图在vs 2013中将数据绑定到textblock。
但是当我尝试将列表项转换为字符串时,我遇到了一些问题。
这是来自vs的错误消息:
no instance of constructor "std::basic_string<_Elem, _Traits,
_Alloc>::basic_string [with _Elem=wchar_t,
_Traits=std::char_traits<wchar_t>, _Alloc=std::allocator<wchar_t>]"
matches the argument list argument types are:
(std::_List_iterator<std::_List_val<std::_List_simple_types<std::string>>>)
这是我的代码:
list <string> c1;
//Insert Data
c1.push_back("one");
c1.push_back("two");
c1.push_back("three");
c1.push_back("Four");
c1.push_back("Five");
c1.push_back("Six");
c1.push_back("Seven");
c1.push_back("Eight");
c1.push_back("Nine");
c1.push_back("Ten");
//Random data from list
int RandNum = 0 + (std::rand() % 10);
auto en = c1.begin();
advance(c1.begin(), RandNum);
std::wstring s1(*en);
std::string s2(*en);
ENTEXT->Text = s2; //ENTEXT is textblock name
我尝试将list元素传递给textblock,但此代码显示
错误C2664:'void Windows :: UI :: Xaml :: Controls :: TextBlock :: Text :: set(Platform :: String ^)':无法将参数1从'std :: string'转换为'Platform :: String ^'
答案 0 :(得分:3)
en
是迭代器。*en
wstring
。这是它应该是什么:
std::string s2(*en);
顺便说一下,列表元素已经是字符串,你不需要转换任何内容。
要将std::string
转换为Platform::String
,您需要使用c_str
成员函数:
ENTEXT->Text = en->c_str();
答案 1 :(得分:1)
自从你写了
&#34;当我尝试将列表项转换为字符串&#34;
时,我遇到了一些问题
而不是具体wstring
,我想你打算取消引用正确的迭代器并将s2
作为普通的std::string
副本
int RandNum = 0 + (std::rand() % 10);
auto en = c1.begin();
std::advance(en, RandNum); // Make sure to advance the right iterator
std::string s2(*en);
请注意,上面将创建迭代器指向的列表元素的副本,但是,它已经是std::string
(不需要转换)。你可以使用解引用的迭代器:
std::cout << *en;
如果您真的需要string->wstring
转换(无论出于何种原因未在问题中解释),您可以写一下:
int RandNum = 0 + (std::rand() % 10);
auto en = c1.begin();
std::advance(en, RandNum); // ditto
std::wstringstream ws;
ws << en->c_str();
std::wstring s2 = ws.str();
或,C ++ 11解决方案(请注意-stdlib=libc++
支持):
//Random data from list
int RandNum = 0 + (std::rand() % 10);
auto en = c1.begin();
advance(en, RandNum);
typedef std::codecvt_utf8<wchar_t> convert_type;
std::wstring_convert<convert_type, wchar_t> converter;
std::wstring converted_str = converter.from_bytes(*en);