Including windows.storage.streams.h

你。 提交于 2019-12-13 00:08:48

问题


I'm trying to put class NativeBuffer from this answer but when windows.storage.streams.h I have much errors like:

Error   1   error C2872: 'AsyncStatus' : ambiguous symbol   c:\program files (x86)\windows phone kits\8.0\include\abi\asyncinfo.h   75
Error   2   error C2872: 'AsyncStatus' : ambiguous symbol   c:\program files (x86)\windows phone kits\8.0\include\abi\asyncinfo.h   76
Error   3   error C2872: 'AsyncStatus' : ambiguous symbol   c:\program files (x86)\windows phone kits\8.0\include\abi\asyncinfo.h   77
Error   4   error C2872: 'AsyncStatus' : ambiguous symbol   c:\program files (x86)\windows phone kits\8.0\include\abi\asyncinfo.h   78
Error   5   error C2371: 'IAsyncInfo' : redefinition; different basic types c:\program files (x86)\windows phone kits\8.0\include\abi\asyncinfo.h   108
Error   6   error C2872: 'AsyncStatus' : ambiguous symbol   c:\program files (x86)\windows phone kits\8.0\include\abi\asyncinfo.h   115
Error   7   error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.foundation.collections.h  1185
Error   8   error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.foundation.collections.h  1186
Error   9   error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.foundation.collections.h  1224
Error   10  error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.foundation.collections.h  1225
Error   11  error C3431: 'PropertyType' : a scoped enumeration cannot be redeclared as an unscoped enumeration  c:\program files (x86)\windows phone kits\8.0\include\abi\windows.foundation.h  3984
Error   12  error C2371: 'ABI::Windows::Foundation::PropertyType' : redefinition; different basic types c:\program files (x86)\windows phone kits\8.0\include\abi\windows.foundation.h  15298
Error   13  error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.storage.search.h  4005
Error   14  error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.storage.search.h  4008
Error   15  error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.storage.search.h  4012
Error   16  error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.storage.search.h  4015
Error   17  error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.storage.h 10488
Error   18  error C2872: 'EventRegistrationToken' : ambiguous symbol    c:\program files (x86)\windows phone kits\8.0\include\abi\windows.storage.h 10491
Error   19  error C2039: 'RuntimeClass' : is not a member of 'Microsoft::WRL'   c:\users\sergey.fedortsov\documents\socialholdem\prj.ipoker\wp8\shared\platform\wp\nativebuffer.h   12
Error   20  error C2504: 'RuntimeClass' : base class undefined  c:\users\sergey.fedortsov\documents\socialholdem\prj.ipoker\wp8\shared\platform\wp\nativebuffer.h   12
Error   21  error C2143: syntax error : missing ',' before '<'  c:\users\sergey.fedortsov\documents\socialholdem\prj.ipoker\wp8\shared\platform\wp\nativebuffer.h   12
Error   22  error C2039: 'RuntimeClassFlags' : is not a member of 'Microsoft::WRL'  c:\users\sergey.fedortsov\documents\socialholdem\prj.ipoker\wp8\shared\platform\wp\nativebuffer.h   13
Error   23  error C3083: 'RuntimeClassType': the symbol to the left of a '::' must be a type    c:\users\sergey.fedortsov\documents\socialholdem\prj.ipoker\wp8\shared\platform\wp\nativebuffer.h   13
Error   24  error C2039: 'WinRtClassicComMix' : is not a member of 'Microsoft::WRL' c:\users\sergey.fedortsov\documents\socialholdem\prj.ipoker\wp8\shared\platform\wp\nativebuffer.h   13
Error   25  error C2039: 'FtmBase' : is not a member of 'Microsoft::WRL'    c:\users\sergey.fedortsov\documents\socialholdem\prj.ipoker\wp8\shared\platform\wp\nativebuffer.h   16

My code:

    #ifndef NATIVE_BUFFER_H
#define NATIVE_BUFFER_H


#include <robuffer.h>
#include <wrl.h>
#include <wrl/implements.h>
#include <wrl\client.h>
#include <windows.storage.streams.h>


/// <summary>
/// The purpose of this class is to transform byte buffers into an IBuffer
/// </summary>
class NativeBuffer : public Microsoft::WRL::RuntimeClass<
    Microsoft::WRL::RuntimeClassFlags< Microsoft::WRL::RuntimeClassType::WinRtClassicComMix >,
    ABI::Windows::Storage::Streams::IBuffer,
    Windows::Storage::Streams::IBufferByteAccess,
    Microsoft::WRL::FtmBase>
{

public:
    virtual ~NativeBuffer()
    {
        if (m_pBuffer && m_bIsOwner)
        {
            delete[] m_pBuffer;
            m_pBuffer = NULL;
        }
    }

    STDMETHODIMP RuntimeClassInitialize(UINT totalSize)
    {
        m_uLength = totalSize;
        m_uFullSize = totalSize;
        m_pBuffer = new BYTE[totalSize];
        m_bIsOwner = TRUE;
        return S_OK;
    }

    STDMETHODIMP RuntimeClassInitialize(BYTE* pBuffer, UINT totalSize, BOOL fTakeOwnershipOfPassedInBuffer)
    {
        m_uLength = totalSize;
        m_uFullSize = totalSize;
        m_pBuffer = pBuffer;
        m_bIsOwner = fTakeOwnershipOfPassedInBuffer;
        return S_OK;
    }

    STDMETHODIMP Buffer( BYTE **value)
    {
        *value = m_pBuffer;
        return S_OK;
    }

    STDMETHODIMP get_Capacity(UINT32 *value)
    {
        *value = m_uFullSize;
        return S_OK;
    }

    STDMETHODIMP get_Length(UINT32 *value)
    {
        *value = m_uLength;
        return S_OK;
    }

    STDMETHODIMP put_Length(UINT32 value)
    {
        if(value > m_uFullSize)
        {
            return E_INVALIDARG;
        }
        m_uLength = value;
        return S_OK;
    }

    static Windows::Storage::Streams::IBuffer^ GetIBufferFromNativeBuffer(Microsoft::WRL::ComPtr<NativeBuffer> spNativeBuffer)
    {
        auto iinspectable = reinterpret_cast<IInspectable*>(spNativeBuffer.Get());
        return reinterpret_cast<Windows::Storage::Streams::IBuffer^>(iinspectable);
    }
    static BYTE* GetBytesFromIBuffer(Windows::Storage::Streams::IBuffer^ buffer)
    {
        auto iinspectable = (IInspectable*)reinterpret_cast<IInspectable*>(buffer);
        Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> spBuffAccess;
        HRESULT hr = iinspectable->QueryInterface(__uuidof(Windows::Storage::Streams::IBufferByteAccess), (void **)&spBuffAccess);
        UCHAR * pReadBuffer;
        spBuffAccess->Buffer(&pReadBuffer);
        return pReadBuffer;
    }
private:
    UINT32 m_uLength;
    UINT32 m_uFullSize;
    BYTE* m_pBuffer;
    BOOL m_bIsOwner;
};


#endif

What can be reason of this?


回答1:


Most probable reason is that you are using namespace in header file!

Eg.

// Header
using namespace System;
using namespace std;

// Your class declaration

Remove all namespace inclusion from headers. Use explicit class inclusion, like

using System::Int32;
using std::vector;

Since you include this header in some other header, and then include standard headers - everything goes into (or is treated into) global namespace. It raises ambiguity. You cannot change the standard header(s) (by prefixing ::, or some other namespace).



来源:https://stackoverflow.com/questions/15767146/including-windows-storage-streams-h

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!