【发布时间】:2017-12-14 08:26:25
【问题描述】:
我有
BaseAbstrac class=> Baseabstrac.h 文件
Derived1 类 => Derived1.h 和 Derived1.cpp 文件
Derived2 class=> Derived2.h 和 Derived2.cpp 文件
NestedClass class=> NestedClass.h 和 NestedClass.cpp 文件
还有 main.cpp。
除了 NestedClass.cpp 之外,所有的 cpp 文件都可以编译。
这是我的错误:
NestedClass.cpp:13:1: error: ‘NestedClass’ does not name a type
NestedClass& Derived1<T>::NestedClass::operator++()
但它是名称类型,因为我将 NestedClass.h 包含在 NestedClass.cpp 中
这是我的头文件和实现文件:
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;
}
【问题讨论】:
-
在您提出下一个不可避免的问题之前,请阅读Why can templates only be implemented in the header file?
-
::NestedClass不是一种类型,::Derived<T>::NestedClass是一种类型(但您可能需要typename来说服编译器)。您的下一个问题是您不能将模板函数(或类模板的成员函数)放在 .cpp 文件中(除非您正在执行显式实例化) -
@MartinBonner 这个问题我该怎么办?你能分开吗?
标签: c++ file templates inheritance