C++ 指向结构错误向量的指针

C++ 指向结构错误向量的指针,c++,visual-studio-2010,pointers,vector,C++,Visual Studio 2010,Pointers,Vector,我正在为移动机器人制作一个.lib文件。 目前我正在编写一个用于扫描蓝牙设备的函数 功能是: struct Device { string DeviceName; BTH_ADDR DeviceAddress; }; void ScanForDevices(vector<Device> *Robot) { m_bt = BluetoothFindFirstRadio(&m_bt_find_radio, &m_radio);

我正在为移动机器人制作一个.lib文件。 目前我正在编写一个用于扫描蓝牙设备的函数

功能是:

struct Device
{
     string DeviceName;
     BTH_ADDR DeviceAddress;
};

void ScanForDevices(vector<Device> *Robot)
    {
        m_bt = BluetoothFindFirstRadio(&m_bt_find_radio, &m_radio);

        BluetoothGetRadioInfo(m_radio, &m_bt_info);
        m_search_params.hRadio = m_radio;

        ZeroMemory(&m_device_info, sizeof(BLUETOOTH_DEVICE_INFO));
        m_device_info.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);

        m_bt_dev = BluetoothFindFirstDevice(&m_search_params, &m_device_info);


        int m_device_id = 0;
        char charDeviceName[250];

        do {
                charDeviceName[250]=NULL;
                Robot->push_back(Device()); 
                //WideCharToMultiByte(CP_UTF8,0,m_device_info.szName,-1, charDeviceName,0,NULL, NULL);
                WideCharToMultiByte(CP_UTF8,0,m_device_info.szName,-1, charDeviceName,250,NULL, NULL);
                Robot[m_device_id]->DeviceName=(string)charDeviceName;
                Robot[m_device_id]->DeviceAddress=m_device_info.Address.ullLong;
                m_device_id++;

            } while(BluetoothFindNextDevice(m_bt_dev,&m_device_info));

            BluetoothFindDeviceClose(m_bt_dev);

            BluetoothFindRadioClose(m_bt);
    }
struct设备
{
字符串设备名;
BTH_地址设备地址;
};
无效扫描设备(矢量*机器人)
{
m_bt=BluetoothFindFirstRadio(&m_bt_find_radio,&m_radio);
BluetoothGetRadioInfo(m_无线电和m_bt_信息);
m_search_params.hRadio=m_无线电;
零内存(&m_设备信息,sizeof(蓝牙设备信息));
m_device_info.dwSize=sizeof(蓝牙_device_info);
m_bt_dev=BluetoothFindFirstDevice(&m_搜索参数,&m_设备信息);
int m_设备_id=0;
char charDeviceName[250];
做{
charDeviceName[250]=空;
机器人->推回(设备());
//WideChartMultiByte(CP_UTF8,0,m_device_info.szName,-1,charDeviceName,0,NULL,NULL);
WideChartMultiByte(CP_UTF8,0,m_device_info.szName,-1,charDeviceName,250,NULL,NULL);
Robot[m_device_id]->DeviceName=(字符串)charDeviceName;
Robot[m_device_id]->DeviceAddress=m_device_info.Address.ullLong;
m_设备_id++;
}while(BluetoothFindNextDevice(m_bt_dev和m_device_info));
蓝鳍金枪鱼(m_bt_dev);
蓝鳍金枪鱼;
}
我不断得到:

Error   6   error C2819: type 'std::vector<_Ty>' does not have an overloaded member 'operator ->'
Error   7   error C2039: 'DeviceName' : is not a member of 'std::vector<_Ty>'
Error   8   error C2819: type 'std::vector<_Ty>' does not have an overloaded member 'operator ->'
Error   9   error C2039: 'DeviceAddress' : is not a member of 'std::vector<_Ty>'
Error   10  IntelliSense: expression must have pointer type 
Error   11  IntelliSense: expression must have pointer type 
错误6错误C2819:类型“std::vector”没有重载成员“operator->”
错误7错误C2039:“DeviceName”:不是“std::vector”的成员
错误8错误C2819:类型“std::vector”没有重载成员“operator->”
错误9错误C2039:“DeviceAddress”:不是“std::vector”的成员
错误10 IntelliSense:表达式必须具有指针类型
错误11 IntelliSense:表达式必须具有指针类型
<>我开始C++,而且不太擅长指针的使用。< /P> 欢迎提供任何帮助。

要按索引访问
vector*Robot
元素,请使用以下语法:

(*Robot)[m_device_id]
您的代码应该是:

(*Robot)[m_device_id].DeviceName=(string)charDeviceName;
请注意,
->
替换为
,因为向量元素具有
设备
类型,这不是指针

现有代码与以下向量声明匹配:

vector<Device*> Robot
矢量机器人
查看差异。

机器人是指向向量的指针。您将自己与点对向量和向量元素访问相混淆。要解决此问题,您可以更改:

Robot[m_device_id]->DeviceName=(string)charDeviceName;

建议

更好的解决方案是通过引用而不是指针传递向量

void ScanForDevices(vector<Device> &Robot)
{
    std::string  charDeviceName;   //<<-- use std::string instead of char array
    Robot[m_device_id].DeviceName = charDeviceName;  //<<-- this is better coding style
}
void扫描设备(矢量和机器人)
{

std::string charDeviceName;//这是对您问题的直接回答。但是,按照billz`answer中的建议更改函数原型是一个好主意。感谢您的回答。我将按照建议进行操作。charDeviceName必须是char,尽管由于WideChartMultiByte的原因,我需要字符串。有没有更好的方法将WCHAR转换为字符串?u虽然如此,您可能仍然需要阵列。
(*Robot)[m_device_id].DeviceName = std::string(charDeviceName);
void ScanForDevices(vector<Device> &Robot)
{
    std::string  charDeviceName;   //<<-- use std::string instead of char array
    Robot[m_device_id].DeviceName = charDeviceName;  //<<-- this is better coding style
}