繁体   English   中英

前向声明模板类时无效使用不完整类型

[英]Invalid use of incomplete type when forward-declaring template class

我从下面的代码中得到两个错误,并且不知道如何解决它们:

第一个错误: invalid use of incomplete type 'class myArray<T>'

第二个错误: declaration of 'class myArray<T>'

我认为这是因为我正在向前声明一个在第一次调用类时尚未实现的成员函数。 但是,如果不预先声明此功能,则会出现倍数错误。

//myArray.h
#ifndef ARRAY_H_INCLUDED
#define ARRAY_H_INCLUDED

#include <iostream>

template<typename T>
class myArray;                                    // Second error

template<typename T>
myArray<T>& myArray<T>::operator=(myArray<T>);    // First error

template<typename T>
void swap(myArray<T>&, myArray<T>&);

template<typename T>
class myArray{
    T* m_ptr{nullptr};
    int m_size{0};

public:
    myArray();
    explicit myArray(int);
    myArray(const myArray&);
    ~myArray();
    myArray& operator=(myArray);
    friend void swap<T>(myArray&, myArray&);
};

#endif // ARRAY_H_INCLUDED
//myArray.cpp
#include "array.h"

template<typename T>
myArray<T>::myArray() = default;

template<typename T>
myArray<T>::myArray(int s){
    if(s>0){
        m_ptr = new T[s]{};
        m_size = s;
    }
}

template<typename T>
myArray<T>::~myArray(){
    delete[] m_ptr;
}

template<typename T>
myArray<T>& myArray<T>::operator=(myArray<T> a){
    swap(*this, a);
    return *this;
}

template<typename T>
void swap(myArray<T>& a, myArray<T>& b){
    std::swap(a.m_ptr, b.m_ptr);
    std::swap(a.m_size, b.m_size);
}
 template<typename T> class myArray; 

那不是错误。 这是类模板的完全有效的正向声明。

 template<typename T> myArray<T>& myArray<T>::operator=(myArray<T>); 

这对两个帐户是错误的。

  1. 在定义类之前,不得使用myArray<T>类型的对象。
  2. 不能将operator=声明为非成员函数。

但是,如果不预先声明此功能,则会出现倍数错误。

删除上面的operator=函数声明,编译代码,然后发布错误消息。 没有这些,很难提出任何有用的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM