2009-10-27 4 views
5

私はダウンロードしたライブラリを作成するときに、奇妙なコンパイルエラーをGCCから取得します。GCCのコンパイルエラー: 'strlen'の宣言が利用可能でなければなりません

エラーはすべてこのようなものです:ここでは

Catalogue.h:96: error: there are no arguments to ‘strlen’ that depend on a template parameter, so a declaration of ‘strlen’ must be available

は、ライン96の周りのコードです:

GaCatalogueEntry(const char* name, T* data) 
{ 
    if(name) 
    { 
     _nameLength = (int)strlen(name); // LINE 96 

     // copy name 
     _name = new char[ _nameLength + 1 ]; 
     strcpy(_name, name);  // LINE 100: similar error 

     _data = data; 

     return; 
    } 

    _name = NULL; 
    _nameLength = 0; 
    _data = NULL; 
} 

は、私はこれらのコンパイルエラーを修正するために何ができますか?

+0

名前に '_ [a-z]。*'と一致する名前のグローバルセットがあるようですが、それらの名前は実装用に予約されています。 ( '_ [a-z]。*'はローカル変数やクラスメンバのような非グローバル名ではOKです) – MSalters

+0

グローバル変数ではないと思いますが、メンバ変数です。私はGaCatalogueEntryがテンプレート化されたクラスのメンバ関数であると推測しています。しかし、あなたは正しいです。接頭辞のアンダースコアを含む名前付け規則を持つことは危険です。メンバ変数の場合は、m_接頭辞または_接尾辞を使用する方がよいでしょう。 –

答えて

3

コードはバグです。おそらく#include <string.h>がありません。

コードを変更しない場合は、-fpermissiveをコンパイラオプションに追加します。 (GCC documentationを参照してください)

10

おそらく、strcpyとstrlenライブラリ関数を含むヘッダーを含める必要があります。

#include <string.h> 

又はC++ STRLEN()関数は、文字列ライブラリの一部であり、ヘッダファイルが含まれていなかったようにそれはほとんど見えにおいて

#include <cstring> 
+1

もっと良い! (strlenの代わりにstd :: strlen()を使用する必要があります)。 – Ben

4

(好ましくは、C++の場合)。

どこにも付属していますか?

include <string.h> 

そうでない場合は、追加して問題が解決するかどうかを確認してください。

+0

はい、問題はヘッダーファイルがありませんでした。しかし、私はエラーメッセージがJavaのような言語として先導的ではないと思います。 – Navid

+1

この場合、エラーの原因は、コードがテンプレートの一部であることによって、やや難解でした。コンパイラは、未確認シンボルがテンプレートパラメータTに依存していた場合にテンプレートが実際にインスタンス化されるまで、エラーを引き起こしていないテンプレートでも識別できないシンボルを検出しました(例えば、シンボルがT :: dosomething )) –

1

a declaration of ‘strlen’ must be available

strlen()

の宣言のためにstring.hまたは<cstring>(C++)を含めます。

関連する問題