I have
BaseAbstrac class => Baseabstrac.h file
Derived1 class => Derived1.h and Derived1.cpp files
Derived2 class => Derived2.h and Derived2.cpp file
NestedClass class => NestedClass.h and NestedClass.cpp file
and also main.cpp.
Except NestedClass.cpp , all cpp files can compile.
This is my error:
NestedClass.cpp:13:1: error: ‘NestedClass’ does not name a type
NestedClass& Derived1<T>::NestedClass::operator++()
But It is name type because I include NestedClass.h into NestedClass.cpp
This is my header and implementation files:
BaseAbstract.h
#ifndef BASEABSTRAC_H
#define BASEABSTRAC_H
#include <iostream>
using namespace std;
template <class T>
class BaseAbstract{
public:
class NestedClass;
virtual int count (const T& val)=0;
};
#endif
Derived1.h
#ifndef DERIVED_H
#define DERIVED_H
#include "BaseAbstrac.h"
#include <memory>
using namespace std;
template <class T>
class Derived1:public BaseAbstract<T>{
protected:
shared_ptr<T>dataS;
int sizeS;
int capacity;
public:
Derived1();
class NestedClass;
int count (const T& val);
};
#endif
Derived1.cpp
#include "Derived1.h"
using namespace std;
template<class T>
Derived1<T>::Derived1()
{
sizeS = 0;
capacity = 0;
}
NestedClass.h
#ifndef NESTEDCLASS_H
#define NESTEDCLASS_H
#include <memory>
#include <string>
#include "Derived1.h"
using namespace std;
template <class T>
class Derived1<T>::NestedClass
{
protected:
T* data;
public:
NestedClass();
T* getData();
NestedClass& operator++();
};
#endif
NestedClass.cpp
#include "NestedClass.h"
using namespace std;
template<class T>
Derived1<T>::NestedClass::NestedClass() { data = new T; }
template<class T>
T* Derived1<T>::NestedClass::getData() { return data; }
template<class T>
NestedClass& Derived1<T>::NestedClass::operator++()
{
data++;
return data;
}
Derived2.h
#ifndef DERIVED2_H
#define DERIVED2_H
#include "Derived1.h"
using namespace std;
template <class K,class V>
class Derived2:public Derived1<pair<K, V> >{
public:
Derived2();
};
#endif
Derived2.cpp
#include "Derived2.h"
using namespace std;
template <class K,class V>
Derived2<K,V>::Derived2():Derived1<pair<K, V> >()
{
this->capacity=10000;
}
main.cpp
#include <iostream>
#include <memory>
using namespace std;
int main(void){
Derived1<int> a;
}