[ad_1]
こんにちは、
C++ のテンプレートは初めてで、C# コードを C++ に移植する際に問題が発生しています。
任意の型を保持できる循環バッファーを作成したいので、テンプレートが必要です。
C#ではこれがあります(簡略化されたコード)
C#
public class buffer<T>; { private T[] items; public buffer(int size) { items = new T[size]; } }
また、使いやすいです:
C#
buffer<int> buf = new buffer<int>(10);
これにより、長さが 10 になる int 型からバッファが作成されます…
とにかく、これをアンマネージ C++ に移植する際に問題が発生しています。
ある種の理解を得るために、c++ のテンプレートに関するいくつかのチュートリアルを読みましたが、これまでのところ解決できません。 おそらく非常に簡単ですが、構文が異なるだけです(推測します)。
これまでの私のC++コード:
ヘッダ:
C++
template <class T> class buffer { public: buffer(unsigned int size); private: T* items; }
ソースファイル:
C++
template <class T> buffer<t>::buffer(unsigned int size) { items = new T[size]; }</t>
これは正しくコンパイルされますが、新しいバッファを作成する方法がわかりました…
C++
buffer<int> buf;
私が思いついた残りの部分も機能していません。
誰かがこれをきちんと修正する方法を教えてもらえますか:)
前もって感謝します!
解決策 2
まず、テンプレート コードに別のソース ファイルを使用しないでください。ヘッダー ファイルに入れます。
C++
template <class T> class buffer { public: buffer(unsigned int size) { items = new T[size]; } private: T* items; };
デフォルトのコンストラクターは定義されていないため、クラスをインスタンス化するときにサイズを指定する必要があります。
C++
buffer<int> buf(10);
…そして、デストラクタを追加することを忘れないでください delete [] items
その寿命の終わりに。
解決策 1
C++
//C++_Class_Templates.cpp #include <iostream.h> #include <vector> template <typename t> class MyQueue { std::vector<t> data; public: void Add(T const &); void Remove(); void Print(); }; template <typename t> void MyQueue<t> ::Add(T const &d) { data.push_back(d); } template <typename t> void MyQueue<t>::Remove() { data.erase(data.begin( ) + 0,data.begin( ) + 1); } template <typename t> void MyQueue<t>::Print() { std::vector<int>::iterator It1; It1 = data.begin(); for ( It1 = data.begin( ) ; It1 != data.end( ) ; It1++ ) cout << " " << *It1<<endl; } //Usage for C++ class templates void main() { MyQueue<int> q; q.Add(1); q.Add(2); cout<<"Before removing data"<<endl; q.Print(); q.Remove(); cout<<"After removing data"<<endl; q.Print(); }
解決策 3
解決策 4
C++
template<typename T, int N> struct Buffer { using value_type = T; T data[N]; constexpr int size() { return N; } };
[ad_2]
コメント