| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2260 人关注过本帖
标题:谁帮我看瞎这个模板哪里错了!看了半天都没发现错误!
只看楼主 加入收藏
libinden71
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2015-12-3
结帖率:63.64%
收藏
已结贴  问题点数:10 回复次数:8 
谁帮我看瞎这个模板哪里错了!看了半天都没发现错误!
类文件:
程序代码:
#pragma once
#include "head.h"

template <typename T>
class Vector
{
public:
    Vector();
    ~Vector();

    T & operator[](int nNumber);//重载[]
    
    void AllocatedMemory();//分配内存
    bool judgeMemory();//判断内存是否已满
    void push_back(T nX);//尾部增加
    void pop_back();//尾部弹出
    T &at(int pos);//返回pos位置元素的引用
    T &front();//返回首元素的引用
    T &back();// 返回尾元素的引用
    T *begin();
    T *end();
    T *rbegin();
    T *rend();
    int size();//返回个数
    
    enum {MEMORY_SIZE_TWO_TIMES};

private:
    T *m_nX;
    int m_nMemorySzie;
    int m_nCount;
};




[code]
#include "Vector.h"


template <typename T>
Vector<T>::Vector()
    :m_nX(nullptr), m_nMemorySzie(1024), m_nCount(0)
{
}

template <typename T>
Vector<T>::~Vector()
{
    delete m_nX;
}

template <typename T>
void Vector<T>::AllocatedMemory()//分配内存
{
    if (m_nX == nullptr)
    {
        m_nX = new T[sizeof(T)*m_nMemorySzie];//分配内存
    }
    else if(judgeMemory())
    {
        T *NewX = new T[sizeof(T)*m_nMemorySzie*MEMORY_SIZE_TWO_TIMES];//再次分配内存
        memcpy(NewX, m_nX, m_nMemorySzie);//内存数据拷贝

        m_nMemorySzie *= MEMORY_SIZE_TWO_TIMES;//内存大小*2
        delete[] m_nX;//删除原有内存
        m_nX = NewX;//重新指向新内存
    }
}

template<typename T>
bool Vector<T>::judgeMemory()//判断内存是否已满
{
    return m_nMemorySzie == m_nCount ? true : false;
}

template<typename T>
void Vector<T>::push_back(T nX)//尾部增加
{
    AllocatedMemory();//内存分配

    m_nX[m_nCount++] = nX;//尾部添加
}

template<typename T>
void Vector<T>::pop_back()//尾部弹出
{
    m_nCount--;//尾部删除
}

template<typename T>
T &Vector<T>::at(int pos)//返回pos位置元素的引用
{
    return m_nX[pos];
}

template<typename T>
T &Vector<T>::front()//返回首元素的引用
{
    return *m_nX;
}

template<typename T>
T &Vector<T>::back()// 返回尾元素的引用
{
    return *(m_nX + m_nCount - true);
}

template<typename T>
T *Vector<T>::begin()//返回向量头指针,指向第一个元素
{
    return m_nX;
}

template<typename T>
T *Vector<T>::end()// 返回向量尾指针,指向向量最后一个元素的下一个位置
{
    return m_nX + m_nCount;
}

template<typename T>
T *Vector<T>::rbegin()// 反向迭代器,指向最后一个元素
{
    return m_nX + m_nCount - true;
}

template<typename T>
T *Vector<T>::rend()// 反向迭代器,指向第一个元素之前的位置
{
    return m_nX - true;
}

template<typename T>
int Vector<T>::size()//返回个数
{
    return m_nCount;
}

template<typename T>
T &Vector<T>::operator[](int nNumber)
{
    return m_nX[nNumber];
}


错误信息:
严重性    代码    说明    项目    文件       禁止显示状态
错误    LNK2019    无法解析的外部符号 "public: __thiscall Vector<int>::~Vector<int>(void)" (??1?$Vector@H@@QAE@XZ),该符号在函数 _main 中被引用    vector    F:\Code\vector\vector\main.obj    1   
严重性    代码    说明    项目    文件       禁止显示状态
错误    LNK2019    无法解析的外部符号 "public: __thiscall Vector<int>::Vector<int>(void)" (??0?$Vector@H@@QAE@XZ),该符号在函数 _main 中被引用    vector    F:\Code\vector\vector\main.obj    1   
严重性    代码    说明    项目    文件       禁止显示状态
错误    LNK2019    无法解析的外部符号 "public: void __thiscall Vector<int>::push_back(int)" (?push_back@?$Vector@H@@QAEXH@Z),该符号在函数 _main 中被引用    vector    F:\Code\vector\vector\main.obj    1   

搜索更多相关主题的帖子: template Vector int 内存 返回 
2018-10-31 15:56
libinden71
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2015-12-3
收藏
得分:0 
求大佬帮我看看 是不是我哪里写错了!
2018-10-31 15:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
我怀疑你将 模板的实现放在cpp中编译了

你将
template <typename T>
Vector<T>::Vector()
    :m_nX(nullptr), m_nMemorySzie(1024), m_nCount(0)
{
}
等实现放到 Vector.h 中试试
2018-10-31 16:08
libinden71
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2015-12-3
收藏
得分:0 
以下是引用rjsp在2018-10-31 16:08:49的发言:

我怀疑你将 模板的实现放在cpp中编译了

你将
template <typename T>
Vector<T>::Vector()
    :m_nX(nullptr), m_nMemorySzie(1024), m_nCount(0)
{
}
等实现放到 Vector.h 中试试

还有1个错误!  我把构造和析构都放到了类里
严重性    代码    说明    项目    文件       禁止显示状态
错误    LNK2019    无法解析的外部符号 "public: void __thiscall Vector<int>::push_back(int)" (?push_back@?$Vector@H@@QAEXH@Z),该符号在函数 _main 中被引用    vector    F:\Code\vector\vector\main.obj    1   
2018-10-31 16:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
回复 4楼 libinden71
为什么?为什么不将push_back等全部放到头文件中去?
2018-10-31 16:27
libinden71
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2015-12-3
收藏
得分:0 
以下是引用rjsp在2018-10-31 16:27:54的发言:

为什么?为什么不将push_back等全部放到头文件中去?

想起来了!多谢大佬!
2018-10-31 16:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 6楼 libinden71
你代码中错误很多
1. 尺寸、下标 等应该用 size_t 类型,不要再用 int 了
2. 缺省 拷贝构造、赋值函数 等,建议搜索“浅拷贝”相关的概念
3. front 等一系列函数需要重载 const 版本
4. MEMORY_SIZE_TWO_TIMES 是 0 吧,但猜你意图应该是 2
5. Vector<T>::~Vector() 中 应该是 delete[] 吧
6. Vector<T>::AllocatedMemory() 中 new T[sizeof(T)*m_nMemorySzie] 应该是 new T[m_nMemorySzie] 吧,是不是与malloc用法混淆了
7. memcpy 不是可以瞎用的,只有 is_trivially_copyable 的类型才可以
没细看


[此贴子已经被作者于2018-11-1 10:11编辑过]

2018-10-31 16:45
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
收藏
得分:0 
template class 不要分开写
如果一定要分开写, 那就要
#include <Vector.h>
#include <Vector.cpp>
2018-10-31 19:21
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
收藏
得分:0 
还有就是 void AllocatedMemory();
这个应该是私用的, 不应该开放给外面使用
Vector 的内存最好自己来管理
另外, 你这个 Vector 怎么没有 erase 和 insert...
2018-10-31 19:23
快速回复:谁帮我看瞎这个模板哪里错了!看了半天都没发现错误!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021168 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved