【发布时间】: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