C++ Error Message Collection(1)does not name a type, 11 articles


目的

C++に限らず、コンパイルエラーがたくさん出るとめげる。
根本原因のエラーと、それに付属する関連エラーがあり、
根本原因エラーさえ取れば、みんなきれさっぱりなくなることがある。

複数のファイルにまたがるエラーは、相互に影響があり、どちらを直すとより効率的かを判断できないと無駄な作業が発生するかもしれない。

効率的にコンパイルエラーを取る方法を探るため、コンパイルエラー情報とその際の対応方法を収集する。

成果

コンパイルエラーとその時の条件に従い、すぐにコンパイルエラーが取れるようになる。

コンパイルエラーが取れれば、printf(cout)デバッグができるかもしれない。

関連

悲しいのはprintf(cout)デバッグをしようとすると、コンパイルエラーが出る時。

printf(cout)デバッグをしてもコンパイルエラーが出ない方法も順次追記する。

複雑な構造を持った新たなclassは、直接coutしようとせず、よく知った必要な型に変換して出力するのも手かも。

castしようとすると、castのコンパイルエラーが出るかもしれない。
castでコンパイルエラーが出ない方法を知っているとよい。

(1) does not name a type

1.1 error: ‘Result’ does not name a type

上記はg++の場合。
clang++は
error: unknown type name 'Result'; did you mean 'Foo::Result'?

解決:「クラス名::」を付加する。

1.2 error: 'byte' does not name a type

web コンパイラでの複数ファイルの取り扱い等
https://japan.renesasrulz.com/gr_user_forum_japanese/f/web_compiler/547/web/2922?pi5348=8&pi5351=1

解決:設計環境でコンパイル対象ファイルの指定をする。

1.3 does not name a type

C++,エラー: ○○ does not name a type
http://chowe.at.webry.info/200612/article_8.html
http://s.webry.info/sp/chowe.at.webry.info/200612/article_8.html

「互いのヘッダファイルを相互にincludeしていた」

解決:ヘッダファイルの最初に、

header.hpp
#ifndef HEADER_HPP
#define HEADER_HPP
//ヘッダファイルの中身
#endif

という、それぞれにファイル名固有の定数をifndefのあとで宣言していれば、相互にincludeしても悪さはしないかも。

1.4 "string" does not name a type

[C++] Includeしたはずのクラスが使えない? ---
http://debuggingasusual.blogspot.jp/2011/11/does-not-name-type.html

「解決:4行目のstring をstd::stringにする。
あるいは、using namespace std;を2行目に書く。」

1.5 'index' does not name a type

autoがエラーになる
https://dixq.net/forum/viewtopic.php?t=10114

解決:--std=c++0xを追記
「g++ --std=c++0x ファイル名 」

1.6 error: ‘test.hpp’ in namespace ‘dirA’ does not name a type

includeが出来ない訳とは?
https://oshiete.goo.ne.jp/qa/4606701.html

解決:
「「dirAの上のディレクトリ」に対してinclude用のパスが設定されている必要があります」

1.7 does not name a type

Arduinoエラー:型の名前を指定していませんか?
https://code.i-harness.com/ja/q/11c5ac9

「#include 」
 includeしてなかった?

1.8 does not name a type

C++。++を語る有名言語はC++一つしかないので、「ぷらぷら」と訓む。
http://neetance.x.fc2.com/TO/guide/create/Cpp.html

解決:
「<具体例>
 ・その順以前に定義してない
 ・プロトタイプ宣言忘れ
 ・ヘッダのインクルード漏れ
 ・C++なのに相互参照が可能だと思い込んでる」

1.9 someheader.h:99:13: error: ‘ptrdiff_t’ does not name a type

gcc (g++) 4.9でGNU MPをコンパイルする時のメモ
https://qiita.com/tell/items/8a4cf5d233b637ae5a09

解決: <cstddef>をinclude
「A workaround until libraries get updated is to include or before any headers from that library.」

1.10 error: 'u_char' does not name a type

Arduinoで作る簡易ネットワーク百葉箱について
http://www.senio.co.jp/bbs/viewtopic.php?f=7&t=104

解決:utility/types.hがどこにあるか探す。
なければ入れる。
あれば、そのフォルダをinclude対象にする

1.11 error: 'T' does not name a type

C++N4741 (50)8.5.1.9 Static cast [expr.static.cast]p105
https://qiita.com/kaizen_nagoya/items/e76c21417f6e21c1485e

解決
yumetodo さんからのご指導
https://teratail.com/questions/126548#reply-192709

「template<typename T>」を入れ、他は関数の中に記述。

解決(resolution list)

include系

includeファイルの指定方法間違い

ヘッダファイルが、includeフォルダにあれば<>を使い、CPPファイルと同じカレントフォルダにあれば” ”を使う。

コンパイル時に -Iで該当フォルダを指定しても良い。
MakefileなどにINCLUDE記述をする。

この項は書きかけです。順次追記します。

include行の置き場所間違い

includeファイルには、呼び出す順番によって振る舞いが異なる場合があります。あるヘッダファイルより、先に呼び出す必要がある場合があります。

ifndefの記述の有無

各行にifndef文があルものであれば、必要そうなヘッダファイルはinclude記述をしておくと良い。自分が記述したヘッダファイルにも、必ずifndef文はいれておく。

変数の宣言

プロトタイプ宣言を使う前にする。
定義を使う前にする。
Templateの場合には、例えばtemplate<typename T>

Template

関数の中で記述する事項と関数の外で記述する事項の区分

課題(agenda)

宣言と定義を同時にするかどうか。
宣言と定義が別ファイルにあっても良いかどうか。

参考文献(reference)

C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010

C++N4606, 2016Working Draft 2016, ISO/IEC 14882,符号断片編纂一覧(example code compile list)
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

C++N3242, 2011 sample code compile list on clang++ and g++
https://qiita.com/kaizen_nagoya/items/685b5c1a2c17c1bf1318

文書履歴(document history)

ver. 0.10 初稿 20180516
ver. 0.11 課題を追記 20180516
ver. 0.20 Templateを追記 20180518
ver. 0.21 項目番号変更 20180520