类模版的编译错误

Tylerwong 2009-04-17 01:44:19
小弟的程序有很多问题,希望大家能帮忙看看~~

头文件SimChain.h
/*
* -------Copyright (c)--------
* 2009, Hunan University Software School OOPDA The Third Team 3TminiDB Project
* All rights reserved.
*
* -------File Info-------
* File Name: SimChain.h
* File Description: 主要实现了静态链表中链表类的声明和定义
* Creat Time: 2009年3月31日
* Author: 王洋
* Change History:
* 1.
* 2.
* 3.
*
* -----------Todo List-----------
* 1.添加注释
* 2.统一命名规则
* 3.
*/
#pragma once

template <class T>
class SimNode
{
public:
SimNode(void);
~SimNode(void);
//friend SimSpace<T>;
//private:
T data;
int link;
};

template <class T>
class SimSpace
{
public:
SimSpace(int MaxSpaceSize = /*DefaultSize*/100);//
~SimSpace() { delete [] node; }
int Allocate();
void Deallocate(int& i);
private:
int NumberOfNodes, first;
SimNode<T>* node;
};

template <class T>
SimSpace<T>::SimSpace(int MaxSpaceSize)
{
NumberOfNodes = MaxSpaceSize;
node = new SimNode<T>[NumberOfNodes];
for(int i = 0; i < NumberOfNodes - 1; i++)
node[i].link = i + 1;
node[NumberOfNodes - 1].link = -1;//node[i].link = -1;
first = 0;
}

template <class T>
int SimSpace<T>::Allocate()
{
if(first == -1) throw NoMem();
int i = first;
first = node[i].link;
return i;
}

template <class T>
void SimSpace<T>::Deallocate(int& i)//
{
node[i].link = first;
first = i;
i = -1;
}

//用Record类来套用模板成行,用Stringc类来套用模板成列
template <class T>
class SimChain
{
public:
SimChain() { first = -1; }
~SimChain() { Destory(); }
void Destory();
int Length() const;
bool Delete(int k, T& x);
bool Insert(int k, const T& x);

//bool Find(int k, T& x) const;
//int Search(const T& x) const;
//void Output(ostream& out) const;
private:
int first;
static SimSpace<T> S;
};

template<class T>
void SimChain<T>::Destory()
{
int next;
while(first != -1)
{
next = S.node[first].link;
S.Deallocate(first);
first = next;
}
}

template<class T>
int SimChain<T>::Length() const
{
int current = first;
len = 0;
while(current != -1)
{
current = S.node[current].link;
len++;
}
return len;
}

template<class T>
bool SimChain<T>::Delete(int k, T &x)
{
if (k < 1 || first == -1)
return false;
int p = first;
if (k == 1)
first = S.node[first].link;
else
{
int q = first;
for (int index = 1; index < k - 1 && q != -1; index++)
q = S.node[q].link;
if (q == -1 || S.node[q].link == -1)
return false;
p = S.node[q].link;
S.node[q].link = S.node[p].link;
}
x = S.node[p].data;
S.Deallocate(p);
return true;
}

template<class T>
bool SimChain<T>::Insert(int k, const T &x)
{
if(k < 0) return false;
int p = first;
for (int index = 1; index < k && p != -1; index ++)
p =S.node[p].link;
if(k > 0 && p == -1)
return false;
int y = S.Allocate();
S.node[y].data = x;
if (k)
{
S.node[y].link = S.node[p].link;
S.node[p].link = y;
}
else
{
S.node[y].link = first;
first = y;
}
return true;
}

//template<class T>
//bool SimChain<T>::Find(int k, T &x) const
//{
// if (k < 1) return false;
// int current = first;
// index = 1;
// while(index < k && current != -1)
// {
// current = S.node[current].link;
// index++;
// }
// if(current != -1)
// {
// x = S.node[current].data;
// return ture;
// }
// return false;
//}



cpp文件 测试静态指针.cpp
/*
* -------Copyright (c)--------
* 2009, Hunan University Software School OOPDA The Third Team 3TminiDB Project
* All rights reserved.
*
* -------File Info-------
* File Name: 测试静态指针.cpp
* File Description:
* Creat Time: 2009年3月31日
* Author: 王洋
* Change History:
*
* -----------Todo List-----------
*/
#include "c:\Users\WL\Documents\Visual Studio 2008\Projects\TTTminiDB\TTTminiDB\SimChain.h"

int main()
{
SimChain<int> a;
return 0;
}


这是编译时提示的错误
error C2248: “SimSpace<T>::node”: 无法访问 private 成员(在“SimSpace<T>”类中声明)
1> with
1> [
1> T=int
1> ]
1> c:\users\wl\documents\visual studio 2008\projects\tttminidb\tttminidb\simchain.h(45) : 参见“SimSpace<T>::node”的声明
1> with
1> [
1> T=int
1> ]
1> c:\users\wl\documents\visual studio 2008\projects\tttminidb\tttminidb\simchain.h(98): 编译类 模板 成员函数“void SimChain<T>::Destory(void)”时
1> with
1> [
1> T=int
1> ]
1> c:\users\wl\documents\visual studio 2008\projects\测试静态指针\测试静态指针\测试静态指针.cpp(26): 参见对正在编译的类 模板 实例化“SimChain<T>”的引用
1> with
1> [
1> T=int
1> ]
...全文
197 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tylerwong 2009-04-19
  • 打赏
  • 举报
回复
我最终的修改的程序是:

template <class T>
class SimChain
{
public:
SimChain() { first = -1; cout << "SimChain" << endl; }
~SimChain() { Destory(); cout << "~SimChain" << endl;}
void Destory();
int Length() const;
bool Delete(int k);
bool Insert(int k, const T& x);

//bool Find(int k, T& x) const;
//int Search(const T& x) const;
//void Output(ostream& out) const;

static SimSpace<T> S;

private:
int first;
};
//关键是这一句
template<class T>
SimSpace<T>
SimChain<T>::S;
Tylerwong 2009-04-19
  • 打赏
  • 举报
回复
谢谢大家~结贴
wanghao111 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tangshuiling 的回复:]
C/C++ code
粗略的看了一下,指出楼主的几个关键点问题:
一、SimChain类中到处可见类似S.node[first].link;这种写法,node虽是类SimSpace的对象,但
对private属性成员的访问需要在本类中进行(这是访问的作用域问题),解决的办法有两种,其一提供
访问的成员函数,当然函数本身的属性为public。假设为GetValue;
SimNode& Getvalue(int index)const { return node[i];}
那S.node[first].link;的写法就改为了:S.GetValue(f…
[/Quote]
liliangbao 2009-04-17
  • 打赏
  • 举报
回复
一起加油吧,顶!
firsthym 2009-04-17
  • 打赏
  • 举报
回复
基础知识啊,楼主,加油哦
liubuweiright 2009-04-17
  • 打赏
  • 举报
回复
学习...
Tylerwong 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tangshuiling 的回复:]
C/C++ code粗略的看了一下,指出楼主的几个关键点问题:
一、SimChain类中到处可见类似S.node[first].link;这种写法,node虽是类SimSpace的对象,但
对private属性成员的访问需要在本类中进行(这是访问的作用域问题),解决的办法有两种,其一提供
访问的成员函数,当然函数本身的属性为public。假设为GetValue;
SimNode&Getvalue(intindex)const{returnnode[i];}
那S.node[first].link;的写法就改为了:S.GetValue(first).link;

[/Quote]
哈哈 兄弟太牛了~~我是新手 慢慢进步吧
Tylerwong 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sytstarac 的回复:]
static SimSpace <T> S;
只是对S进行了声明,还需要在类体外进行定义,也就是初始化。比如说在类声明外下面紧跟着些:template <class T>  SimChain <T>::SimSpace <T> S=somevalue~~~
一般来说静态数据成员应该定义在类的实现文件中,以防止多次包含头文件的多次重复定义。如果你只包含一次头文件,也可以写在头文件中。此处比较特殊,即是静态数据成员,又是模板。不知道该怎么处理,请高手来回答吧。
上面的错误应该是只有…
[/Quote]
太感谢大家了~~
tangshuiling 2009-04-17
  • 打赏
  • 举报
回复

粗略的看了一下,指出楼主的几个关键点问题:
一、SimChain类中到处可见类似S.node[first].link;这种写法,node虽是类SimSpace的对象,但
对private属性成员的访问需要在本类中进行(这是访问的作用域问题),解决的办法有两种,其一提供
访问的成员函数,当然函数本身的属性为public。假设为GetValue;
SimNode& Getvalue(int index)const { return node[i];}
那S.node[first].link;的写法就改为了:S.GetValue(first).link;
其二是直接定义SimNode* node;为public属性,这个一楼已经说了;
二、类SimChain中的静态成员static SimSpace<T> S;必须初始化
SimChain::SimSpace<T> s=SimSpace<T>(12); //这个初始化必须在类外,就算在main函数前也行!

其算法的逻辑性没有时间看了,楼主自行检查吧。


sytstarac 2009-04-17
  • 打赏
  • 举报
回复
static SimSpace<T> S;
只是对S进行了声明,还需要在类体外进行定义,也就是初始化。比如说在类声明外下面紧跟着些:template <class T> SimChain<T>::SimSpace<T> S=somevalue~~~
一般来说静态数据成员应该定义在类的实现文件中,以防止多次包含头文件的多次重复定义。如果你只包含一次头文件,也可以写在头文件中。此处比较特殊,即是静态数据成员,又是模板。不知道该怎么处理,请高手来回答吧。
上面的错误应该是只有S的声明,没有定义,所以会链接错误(找不到定义)。
pengzhixi 2009-04-17
  • 打赏
  • 举报
回复
static SimSpace<T> S;
要在类声明外定义一次
Tylerwong 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jame2001 的回复:]
C/C++ codetemplate<classT>classSimSpace
{public:
SimSpace(intMaxSpaceSize=/*DefaultSize*/100);//~SimSpace() { delete [] node; }intAllocate();voidDeallocate(int&i);
SimNode<T>*node;//move to hereprivate:intNumberOfNodes, first;//SimNode<T>* node;};
[/Quote]谢谢你啦,但还是有问题~再帮忙看看吧~
error LNK2001: 无法解析的外部符号 "private: static class SimSpace<int> SimChain<int>::S" (?S@?$SimChain@H@@0V?$SimSpace@H@@A)
1>C:\Users\WL\Documents\Visual Studio 2008\Projects\测试静态指针\Debug\测试静态指针.exe : fatal error LNK1120: 1 个无法解析的外部命令
Dinelgua 2009-04-17
  • 打赏
  • 举报
回复
支持
liliangbao 2009-04-17
  • 打赏
  • 举报
回复
帮顶了~~~
jame2001 2009-04-17
  • 打赏
  • 举报
回复

template <class T>
class SimSpace
{
public:
SimSpace(int MaxSpaceSize = /*DefaultSize*/100);//
~SimSpace() { delete [] node; }
int Allocate();
void Deallocate(int& i);
SimNode<T>* node;//move to here
private:
int NumberOfNodes, first;
//SimNode<T>* node;
};

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧