質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1951閲覧

templateを使ったときにnamespace stdはどこに置くのか

reotantan

総合スコア295

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/12/18 22:39

このコードではnamespace stdをどうやら認識できていないようで、
NULLなども解決できないと言われてしまいました。
templateを使うときはヘッダーファイルにインターフェースと実装を二つ含めるという事でnamespace stdはどこに置くべきでしょうか?
またほかの原因でこのエラーが起きているなら、教えていただけるととても助かります。
よろしくお願いします

コード template<class ItemType> struct NodeType; template<class ItemType> class Circularlinked { public: Circularlinked(); ~Circularlinked(); bool IsFull() const; int LengthIs() const; void MakeEmpty(); void RetriveItem(ItemType &item, bool &found); void InsertItem(ItemType item); void DeleteItem(ItemType item); void ResetList(); void GetNextItem(ItemType & item); private: NodeType<ItemType>* listData; int length; NodeType<ItemType>* currentPos; }; #include<cstddef> #include<new> using namespace std; template<class ItemType> struct NodeType { ItemType info; NodeType *next; }; template<class ItemType> Circularlinked<class ItemType>::Circularlinked() { length = 0; listData = NULL; } template<class ItemType> bool Circularlinked<ItemType>::IsFull() const { NodeType<ItemType>* location; try { location = new NodeType<ItemType>; delete location; return false; } catch (bad_alloc exception) { return true; } } template<class ItemType> int Circularlinked<ItemType>::LengthIs() const { return length; } template<class ItemType> void Circularlinked<ItemType>::MakeEmpty() { NodeType<ItemType>* tempPtr; while (listData != NULL) { tempPtr = listData; listData = listData->next; delete tempPtr; } length = 0; } template<class ItemType> void Circularlinked<ItemType>::RetriveItem(ItemType& item, bool&found) { bool moreToSearch; NodeType<ItemType>* location; location = listData; found = false; moreToSearch = (location != NULL); while (moreToSearch && !found) { if (location->info < item) { location = location->next; moreToSearch = (location != NULL); } else if (item == location->info) { found = true; item = location->info; } else moreToSearch = false; } } template<class ItemType> void Circularlinked<ItemType>::InsertItem(ItemType item) { NodeType<ItemType>*newNode; NodeType<ItemType>*predLoc; NodeType<ItemType>*location; bool moreToSearch; location = listData; predLoc = NULL; moreToSearch = (location != NULL); //find insertion point while (moreToSearch) { if (location->info < item) { predLoc = location; location = location->next; moreToSearch = (location != NULL); } else moreToSearch = false; } // Prepare node for insertion newNode = new NodeType<ItemType>; newNode->info = item; //Insert node into list if (predLoc == NULL) { newNode->next = listData; listData = newNode; } else { newNode->next = location; predLoc->next = newNode; } length++; } template<class ItemType> void Circularlinked<ItemType>::DeleteItem(ItemType item) { NodeType<ItemType>* location = listData; NodeType<ItemType>* tempLocation; if (item == listData->info) { tempLocation = location; listData = listData->next; } else { while (!(item == (location->next)->info)) location = location->next; tempLocation = location->next; location->next = (location->next)->next; } delete tempLocation; length--; } template<class ItemType> void Circularlinked<ItemType>::ResetList() { currentPos = NULL; } template<class ItemType> void Circularlinked<ItemType>::GetNextItem(ItemType &item) { if (currentPos == NULL) currentPos = listData; else currentPos = currentPos->next; item = currentPos->info; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

単純なタイプミスのようです。

誤> Circularlinked<class ItemType>::Circularlinked() {
正> Circularlinked<ItemType>::Circularlinked() {

ところで、コンパイラは何を使われてます? MSVC 2015とgcc(MinGW) 4.9.2でやってみたのですが、「NULLなども解決できない」エラーはでませんでした。

MSVC 2015では、いつものように不可思議なエラーでした。(テンプレートに対して、的確なエラーをあまり出してくれません。)

test.cpp(31): error C2649: 'typename': は 'class' ではありません。 test.cpp(145): fatal error C1004: 予期せぬ EOF が検出されました。

gcc(MinGW)は、もう少しまともで下記エラーでした。

test.cpp:31:22: error: using template type parameter 'ItemType' after 'class' Circularlinked<class ItemType>::Circularlinked() { ^ test.cpp:31:30: error: template argument 1 is invalid Circularlinked<class ItemType>::Circularlinked() { ^ test.cpp:31:48: error: conflicting declaration of template 'template<class ItemType> int Circularlinked()' Circularlinked<class ItemType>::Circularlinked() { ^ test.cpp:4:7: note: previous declaration 'template<class ItemType> class Circularlinked' class Circularlinked { ^

投稿2015/12/19 00:58

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/12/19 01:49

minGWを使っています、c++全ての標準を満たすコンパイラはないという事を見たのですが、常に新しい機能を使いたい場合にコンパイラーは新しいものを導入していくという形になるのでしょうか?
reotantan

2015/12/19 01:53

今eclipseを開いたのですが、コードを何も変えていないのですが、エラーはすべて消えていました。eclipseにおいてプロジェクトの数が増えると、eclipseがコードに問題ないのにも関わらずエラーを起こすっていう事はありえますか?
Chironian

2015/12/19 03:29

> 常に新しい機能を使いたい場合にコンパイラーは新しいものを導入していく そんな感じですね。どうしても使いたい機能を持っているコンパイラがリリースされたら、それにアップデートします。懐具合やリリース形態など他の要因も必要に応じて考慮します。(MSVCとgccは懐具合を考慮しなくて済むので助かってます。) > 今eclipseを開いたのですが、コードを何も変えていないのですが、エラーはすべて消えていました。 eclipseといえど自動修正はしないだろうと思います。 上記行を確認してclassが残っているか確認はしておいた方が良いと思います。 > eclipseにおいてプロジェクトの数が増えると、eclipseがコードに問題ないのにも関わらずエラーを起こすっていう事はありえますか? eclipseは使ってないので分かりませんが、あり得ない話ではないと思います。 私は、IDEはBorland C++BuilderとVisual Studioを長く使ってました。昔はどうしてもビルド・エラーが取れず困った時、リビルド(再構築)するとあっさり治ることがまれにありました。最近はかなり減った感じですが、皆無ではなさそうです。
Chironian

2015/12/19 03:35

とと、MinGW用のIDEとしてeclipseが使えるのですね!! 以前、MinGW/gcc用のIDEとしてQtCreatorを使おうとして、CMakeとの連携が不足して断念しました。 eclipse検討してみます。ありがとう。
reotantan

2015/12/20 15:31

解説ありがとうございました、いつもありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問