C++ 后跟::的名称必须是类或命名空间,但必须定义头
我正在尝试实现一些在源文件的头文件中声明的方法 我一直在犯这个错误C++ 后跟::的名称必须是类或命名空间,但必须定义头,c++,oop,C++,Oop,我正在尝试实现一些在源文件的头文件中声明的方法 我一直在犯这个错误 name followed by :: must be a class or namespace 从搜索来看,这似乎是一个项目设置错误,但是我的两个文件都在正确的目录中 main #include "sarray.h" #include <iostream> using namespace std; template<class genericData> sarray::sarray
name followed by :: must be a class or namespace
从搜索来看,这似乎是一个项目设置错误,但是我的两个文件都在正确的目录中
main
#include "sarray.h"
#include <iostream>
using namespace std;
template<class genericData>
sarray::sarray(int size)
{
if (size > 0) genericData data = new int[size];
else {
cout << "illegal array size = " << size << endl;
exit(1);
}
}
template<class genericData>
sarray::~sarray()
{
delete[] data;
}
template<class genericData>
int& sarray::operator[](int i)
{
if (i < 0 || i >= size) {
cout << "index " << i << " is out of bounds." << endl;
exit(1);
}
return data[i];
}
int main()
{
// create a 10-element safe array
sarray myArray = sarray(10);
sarray array(10);
// in-bound access, [] is used on the left side or an assignment
array[5] = 23;
// in-bound access, [] is used on the right side of an operation
cout << array[5] << endl;
// out-of-bound accesses
array[13] = 392;
cout << array[-1] << endl;
return 0;
}
#包括“sarray.h”
#包括
使用名称空间std;
模板
sarray::sarray(整数大小)
{
如果(大小>0)genericData数据=新整数[大小];
否则{
cout
- 您的成员函数实现也需要模板参数:
template<class genericData>
sarray<genericData>::sarray(...) ...
#包括“sarray.h”
#包括
使用名称空间std;
int main()
{
//创建一个10元素的安全数组
sarray myArray=sarray(10);
沙雷阵列(10);
//在绑定访问中,[]用于左侧或赋值
数组[5]=23;
//在绑定访问中,[]用于操作的右侧
cout&运算符[](int i);
在sarray.h
中应该是int&运算符[](int i);
。这是复制粘贴错误还是在实际代码中?您在定义中遗漏了模板参数;类是sarray
。请仔细查看示例。(在这种情况下,像T
这样无意义的单字符名称比更具描述性的名称更受欢迎。)通常您应该将类模板函数的实现放在标题中。但这不是问题所在。genericData data=new int[size];
可能应该是data=new genericData[size];
另外,尽可能快地阅读“三个法则”。小问题:您(和OP)没有在构造函数中存储size
。@Frodyne良好发现-修复:-)
template<class genericData>
sarray<genericData>::sarray(...) ...
#ifndef SARRAYS_H
#define SARRAYS_H
#include <cstddef>
#include <cstdlib>
#include <stdexcept>
#include <string>
template<class genericData>
class sarray {
public:
sarray(size_t size);
sarray(const sarray&) = delete; // copying deleted
sarray(sarray&&) = delete; // moving deleted
~sarray();
genericData& operator[](size_t i);
private:
size_t size;
genericData* data;
};
template<class genericData>
sarray<genericData>::sarray(size_t size) : // use the member initializer list
size(size),
data(new genericData[size])
{}
template<class genericData>
sarray<genericData>::~sarray() {
delete[] data;
}
template<class genericData>
genericData& sarray<genericData>::operator[](size_t i) {
if (i >= size) throw std::out_of_range(std::to_string(i));
return data[i];
}
#endif
#include "sarray.h"
#include <iostream>
using namespace std;
int main()
{
// create a 10-element safe array
sarray<int> myArray = sarray<int>(10);
sarray<int> array(10);
// in-bound access, [] is used on the left side or an assignment
array[5] = 23;
// in-bound access, [] is used on the right side of an operation
cout << array[5] << endl;
// out-of-bound accesses
array[13] = 392;
cout << array[-1] << endl;
return 0;
}