Итак, я начал кодирование по LinkedStack для себя, и я, наконец, сужу, где произошла ошибка, но я не знаю, как это исправить. Я напишу свой код и ошибку здесь, посмотрим, сможет ли кто-нибудь понять. благодаря
LinkedNode.h
#pragma once
#include"LinkedStack.h"
#include<iostream>
template<class T>
class LinkedNode
{
friend std::ostream& operator<<(std::ostream& os, const LinkedNode<T>& obj);
friend class LinkedStack<T>;
public:
LinkedNode(T val);
T GetElement() const {return element;}
LinkedNode<T>* GetNext() const {return next;}
void SetElement(T val) {element = val;}
void SetNext(LinkedNode<T>* val) {next = val;}
private:
T element;
LinkedNode<T>* next;
};
template<class T>
LinkedNode<T>::LinkedNode(T val):next(nullptr)
{
element = val;
}
template<class T>
std::ostream& operator<<(std::ostream& os, const LinkedNode<T>& obj)
{
os << "Element added is: " << obj.element;
return os;
}
LinkedStack.h
#pragma once
#include<cassert>
#include"LinkedNode.h"
template<class T>
class LinkedStack
{
public:
LinkedStack();
int GetSize() const {return size;}
/*void SetSize(int val) {size = val;}
bool IsTmpty() const {return size == 0;}
void Push(T val);*/
private:
LinkedNode<T>* head; // This is where the errors occur, it does not accept
// the generic type T for the LinkedNode class !!!
int size;
};
template<class T>
LinkedStack<T>::LinkedStack():head(nullptr), size(0)
{
}
Это ошибки, вызванные VS2012:
Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int e:\fall 2013\cpsc 131\test\linkedstack\linkedstack.h 16
Error 3 error C2238: unexpected token(s) preceding ';' e:\fall 2013\cpsc 131\test\linkedstack\linkedstack.h 16
Error 1 error C2143: syntax error : missing ';' before '<' e:\fall 2013\cpsc 131\test\linkedstack\linkedstack.h 16
Ваша проблема связана с круговой зависимостью между заголовками: у вас заголовок A включает заголовок B, который, в свою очередь, включает A (который, в свою очередь, включает B,...).
В вашем примере вам вообще не нужны эти #includes - вы можете обойтись с помощью передовых объявлений. В LinkedNode.h
замените
#include"LinkedStack.h"
с
template <typename T> class LinkedStack;
и аналогично в LinkedStack.h
, используйте форвардное объявление для LinkedNode
.