Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 后跟::的名称必须是类或命名空间,但必须定义头_C++_Oop - Fatal编程技术网

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;
    }