0

私の DynamicArray はほとんど ArrayList です。ユーザーが要素が次々とある連続したメモリブロックを持ち、必要に応じて追加のスペースがあることを許可したいと考えています。私が遭遇した唯一の問題は、ints/floats/bools などの格納でした...それらを格納できるように、_array を T** にすることにしました。

ただし、DynamicArray の add メソッドに定数を渡すのに少し問題があります。値を渡す前に変数に値を格納する必要があります。そうしないと、次のエラーが発生します。

    g++ main.cpp -Wall -Werror -std=c++0x

    main.cpp: In function ‘int main()’:
main.cpp:14:21: error: no matching function for call to ‘triforce::DynamicArray<std::basic_string<char> >::add(const char [5])’
main.cpp:14:21: note: candidates are:
DynamicArray.h:150:10: note: bool triforce::DynamicArray<T>::add(T&) [with T = std::basic_string<char>]
DynamicArray.h:150:10: note:   no known conversion for argument 1 from ‘const char [5]’ to ‘std::basic_string<char>&’
DynamicArray.h:176:10: note: void triforce::DynamicArray<T>::add(uint, T&) [with T = std::basic_string<char>, uint = unsigned int]
DynamicArray.h:176:10: note:   candidate expects 2 arguments, 1 provided

私の DynamicArray には、_array という名前の T** 変数があります。

/**
144      * @brief Adds an element to the end of the array. The array will double in size,
145      * if needed.
146      * @param element The element to be added to the array.
147      * @returns Returns if the element was added successfully.
148      */
149     template<class T>
150     bool DynamicArray<T>::add(T& element)
151     {
152         if(_array == NULL)
153         {
154             errorMsg("Cannot add to null array");
155             return false;
156         }
157 
158         if(_size == _capacity)
159         {
160             increaseCapacity(_capacity * 2);
161         }
162 
163         _array[_size] = &element;
164         _size++;
165 
166         return true;
167     }

これは機能します:

13     string val1 = "val1";
 14     array.add(val1);

これは機能しません

13     string val1 = "val1";
 14     array.add("val1");

最初に変数に入れずに 1 や文字列 "hello" を渡すだけのような定数をこの関数が受け入れるようにするにはどうすればよいですか? パラメーターに const を入れてみましたが、それもうまくいかないようでした。

4

2 に答える 2

1

以下の例では:

#include <type_traits>

template <class T>
void foo( T& arg )
{
  static_assert( std::is_same<T&, const char(&)[6]>::value, "Must be same" );
}

int main()
{
  foo( "Hallo world" );
  return 0;
}

型は const char[6] と推定されます。次に、配列への参照になるため、次のタイプがあります。

const char (&array)[6]

配列の名前 (演算子 [] による修飾なし) は、型 char*、またはこの場合は const char* に崩壊します。

_array[_size] = &element;

したがって、そのアドレスを取得すると、上記の rhs の型は const char*になり、 const char * 型の変数を char& 型の変数に割り当てることはできません(_array[size] によって返されます)。

これは次のように修正できます。

template<class T>
void DynamicArray<T>::add( const T& element )
{
  if(_size == _capacity)
  {
    increaseCapacity(_capacity * 2);
  }
  _array[_size] = element;
  _size++;
}

//------ Added code --------
template<class T>
  template <int N> 
void DynamicArray<T>::add( const T (&array) [N] )
{
  for( std::size_t i = 0; i < N; ++i )
  {
    //Calls your add per element...
    add( array[i] );
  }
}

上記のコードでは std::string を使用できないことに注意してください。このためには、別のオーバーロードが必要になります。また、私の関数には戻り値の型がないことに注意してください (あなたの関数のように)。戻り値の型は、(動的割り当てなどの結果として) エラーがスローされるため、コードでは意味がありませんでした。

最後に、他の場所で述べたように、上記のコードは単に概念を理解するために書かれたものです。実際には std::vector を使用しますが、これはもちろんすでに動的配列です。

于 2013-10-15T03:44:12.263 に答える
0
于 2013-10-15T03:14:52.327 に答える