【问题标题】:"does not name a type" . But It does [closed]“没有命名类型”。但它确实[关闭]
【发布时间】: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&lt;T&gt;::NestedClass 是一种类型(但您可能需要typename 来说服编译器)。您的下一个问题是您不能将模板函数(或类模板的成员函数)放在 .cpp 文件中(除非您正在执行显式实例化)
  • @MartinBonner 这个问题我该怎么办?你能分开吗?

标签: c++ file templates inheritance


【解决方案1】:

在上下文中

template<class T>
NestedClass& Derived1<T>::NestedClass::operator++()
{
    data++;
    return data;
}

没有定义全局NestedClass 符号。您必须使用完整范围:

template<class T>
typename Derived1<T>::NestedClass& Derived1<T>::NestedClass::operator++()
{
    data++;
    return data;
}

您需要typename,因为NestedClass 是一个从属名称as explained here


正如 M.M 在评论中提到的,这也可以使用 尾随返回类型来解决

template<class T>
auto Derived1<T>::NestedClass::operator++() -> NestedClass& 
{
    data++;
    return data;
}

【讨论】:

  • 但是现在,我收到此错误消息:需要在 'Derived1::NestedClass' 之前使用 'typename' 因为 'Derived1' 是依赖范围 Derived1::NestedClass& Derived1 ::NestedClass::operator++()
  • @badparam 啊,是的,我忘了NestedClass 是一个从属名称。更新了答案。
  • 尾随返回类型避免了这个问题
猜你喜欢
  • 2021-08-17
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2023-04-10
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多