2017-12-10 20 views
1

テンプレート関数を使用しています。オンラインで見つかったのは、C++で配列の長さを返すことです。私はメソッドを直接呼び出すと、別のメソッドを呼び出すとエラーが発生することがわかりました。エラーはno instance of function template "array_size" matches the argument listです。ヘルパー関数からテンプレート関数を呼び出せません

私は明らかにメソッドを使って配列を渡す方法について誤解されていますが、なぜこれがうまくいかないのか分かりません。

template<size_t SIZE, class T> inline size_t array_size(T(&arr)[SIZE]) { 
    return SIZE; 
} 
int wordLength(char* word) { 
    return array_size(word) - 1; // Gets argument error 
} 
void fooBar() { 
    int n = array_size("Hello"); // Works! 
    int m = wordLength("Hello"); // What I want } 

は何細部私はこれについて行方不明ですし、私はそれは、そのような私は、あなたがどのようにarray_size作品誤解されているwordLength

+1

'wordLength'には配列がないので、単純にできません。あなたが持っているのはポインタだけで、それが指しているデータやそのメモリに割り当てられているメモリの量を知る方法はありません。コンパイル時に文字列の長さを取得するには、 'constexpr'引数と' constexpr'再帰関数を使用する必要があります。 –

+1

wordlengthを 'int wordLength(char word [])'として宣言すると動作します –

+2

このテンプレートはコンパイル時に配列に対してのみ動作し、charへのポインタや実行時にこの関数を使用しようとしています。 'wordLength'は配列長データをどのような形式でも持っていないため、決して動作しません。これはC++ですので、 'std :: string'を使用してください。 –

答えて

5

を呼び出すことができることをどのように修正すればよいです。配列長情報を型自体から取得するので、array_size("Hello")の場合、リテラルの型は"Hello"で実際にはconst char[6]です。しかし、あなたの関数wordLengthを使用すると、タイプから長さ情報が消去され、それはちょうどchar*になります。あなたのコードを修正する

直接的な方法はwordLengthテンプレートを作るために次のようになります。

template <typename T, size_t N> 
int wordLength(T (&word)[N]) { 
    return array_size(word) - 1; 
} 

しかし、私はあなたが実際にこれを実行しないようお勧めします。文字列を操作する場合は、std::stringタイプに切り替えることをお勧めします。スタック割り当ての固定サイズの配列で作業する場合はstd::arrayに、動的配列を使用する場合はstd::vectorに変更してください。外部APIを使用する場合を除いてC++のCスタイル配列の使用例はほとんどありませんので、コード内で使用することは避けてください。

関連する問題