【问题标题】:Invalid use of incomplete type when forward-declaring template class前向声明模板类时使用不完整类型无效
【发布时间】:2019-12-23 06:56:52
【问题描述】:

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

第一个错误: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);
}

【问题讨论】:

  • 你不能在一个类之外前向声明一个类成员;这与模板无关。将operator= 的声明放在标记为First error 的行上
  • 不是直接问题的原因,但可能会出现下一个问题:Why can templates only be implemented in the header file?
  • @IgorTandetnik 你是对的。此行没有更多错误
  • 你不能在定义类之前声明operator=。这需要低于类的定义。此外,模板必须在头文件中定义,而不是在 cpp 中。
  • @0x499602D2 你的意思是我不需要.cpp中函数实现上面的每个模板行吗?

标签: c++ class templates operator-overloading friend


【解决方案1】:
template<typename T>
class myArray;

这不是错误。这是一个完全有效的类模板前向声明。

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

这在几个帐户上是错误的。

  1. 在定义类之前,您不得使用 myArray&lt;T&gt; 类型的对象。
  2. operator= 不得声明为非成员函数。

但是如果没有前向声明这个函数,就会出现多个错误。

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

【讨论】:

    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 2012-06-28
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多