0

C++/CLI クラスがヘッダー (.h) とコード ファイル (.cpp) に分割されているサンプル コードまたはプロジェクトの方向性を教えていただければ幸いです。メンバー関数でジェネリックを使用します。アンマネージ C++ プロジェクトでテンプレートを作成する方法でジェネリックを構文的に処理しようとしているため、コンパイルに問題があり、分割ファイルで使用されているジェネリックの良い例を見つけることができないようです。はい、C++/CLI でプロジェクトをビルドするのはこれが初めてです。

誰かがエラーを見つけることができれば、これが私のコードです:

C++/CLI .dll:

.h:
#ifndef __ManagedCPlusPlus_h__
#define __ManagedCPlusPlus_h__

//#include "CPlusPlusArray.h"

using namespace System;


class CPlusPlusArray;

namespace ManagedCPlusPlusArray {

    generic<typename S2, typename I2>
    public ref class ManagedCPlusPlusArray
    {
        public:
            ManagedCPlusPlusArray(S2 size);
            void SetItem(S2 index, I2 value);
            I2 GetItem(S2 index);
            S2 Size(void);
            virtual ~ManagedCPlusPlusArray(void);
        private:
            CPlusPlusArray* m_cppa;
    };
}

#endif  



.cpp:
// This is the main DLL file.

#include <STDIO.H>  

//#include "stdafx.h"
#include "ManagedCPlusPlusArray.h"
#include "CPlusPlusArray.h"

using namespace System::Runtime::InteropServices;
namespace ManagedCPlusPlusArray
{
    generic<typename S2, typename I2>
    ManagedCPlusPlusArray<S2,I2>::ManagedCPlusPlusArray(S2 size)
    {
        this->m_cppa = new CPlusPlusArray(size);
    }

    generic<typename S2, typename I2>
    void ManagedCPlusPlusArray<S2,I2>::SetItem(S2 index, I2 value)
    {
        this->m_cppa->SetItem(index, value); 
    }

    generic<typename S2, typename I2>
    I2 ManagedCPlusPlusArray<S2,I2>::GetItem(S2 index)
    {
        return this->m_cppa->GetItem(index);
    }

    generic<typename S2, typename I2>
    S2 ManagedCPlusPlusArray<S2,I2>::Size(void)
    {
        return this->m_cppa->Size();
    }

    generic<typename S2, typename I2>
    ManagedCPlusPlusArray<S2,I2>::~ManagedCPlusPlusArray(void)
    {
        delete this->m_cppa;
        this->m_cppa = NULL;
    }
}

C++ .dll:

.h:
#ifndef __CPlusPlusArray_h__
#define __CPlusPlusArray_h__

//more about this in reference 1
#ifdef CPLUSPLUSARRAY_EXPORTS
   #define CPLUSPLUSARRAY_API  __declspec(dllexport)   // export DLL information

#else
   #define CPLUSPLUSARRAY_API  __declspec(dllimport)   // import DLL information

#endif 

template <typename I, typename S> class CPLUSPLUSARRAY_API CPlusPlusArray {
private:
    S _size;
    I _items[];
public:
    CPlusPlusArray(S size);
    void SetItem(S index, I value);
    I GetItem(S index);
    S Size(void);
    ~CPlusPlusArray(void);   
};

#endif

.cpp:
#include <iostream>

#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
#include <windows.h>

#include "CPlusPlusArray.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain(
    HMODULE     /*hModule*/,
    DWORD       ul_reason_for_call,
    LPVOID      /*lpReserved*/)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

template <typename I, typename S>
CPlusPlusArray<I, S>::CPlusPlusArray(S size) 
{
    this->_size = size;
    this->_items = new I[this->_size];
}
template <typename I, typename S>
void CPlusPlusArray<I, S>::SetItem(S index, I value) 
{
    this->_items[index] = val;
}
template <typename I, typename S>
I CPlusPlusArray<I, S>::GetItem(S index)
{
    return this->_item[index];
}
template <typename I, typename S>
S CPlusPlusArray<I, S>::Size(void)
{
    return this->_size;
}
template <typename I, typename S>
CPlusPlusArray<I, S>::~CPlusPlusArray(void)
{
    delete[] this->_items;
}
4

1 に答える 1

0

少なくとも 2 つのエラーがあります。

  • クラス宣言と同じ名前空間の cpp ファイルにクラス定義を含める必要があります。

  • 型の不可欠な部分であるため、ジェネリック引数リストを指定する必要があります

したがって、これは次のようになります。

namespace ManagedCPlusPlusArray
{
    generic<typename S, typename I>
    ManagedCPlusPlusArray<S,I>::ManagedCPlusPlusArray(S size)
    {
        this->m_cppa = new CPlusPlusArray(size);
    }
    ...
}
于 2012-12-13T15:46:04.343 に答える