收录日期:2020/12/05 22:13:57 时间:2016/05/17 12:19:33 标签:C语言
为什么以下的代码在链接时报错?

////////////////////////////////////////////////////////////////
// Array2D's declaration
////////////////////////////////////////////////////////////////
template<class T>
class Array2D
{
public:
Array2D(int dem1,int dem2);
~Array2D();

class Array1D
{
public:
Array1D(T* array);
T& operator[](int index);
const T& operator[](int index) const;

private:
T* m_array;
};

Array1D operator[](int index);
const Array1D operator[](int index) const;

private:
T* m_data;
int m_demension1;
int m_demension2;

};

////////////////////////////////////////////////////////////////
// Array2D<T>'s definition
////////////////////////////////////////////////////////////////
template<class T>
Array2D<T>::Array2D(int dem1,int dem2) : m_demension1(dem1),m_demension2(dem2),m_data(0)
{
m_data=new T[dem1*dem2];
}

template<class T>
Array2D<T>::~Array2D()
{
delete[] m_data;
}

template<class T>
Array2D<T>::Array1D Array2D<T>::operator [](int index)
{
return Array1D(m_data+(index*m_demension2));
}

template<class T>
const Array2D<T>::Array1D Array2D<T>::operator [](int index) const
{
return Array1D(m_data+(index*m_demension2));
}


////////////////////////////////////////////////////////////////
// Array2D<T>::Array1D's definition
////////////////////////////////////////////////////////////////
template<class T>
Array2D<T>::Array1D::Array1D(T* array) : m_array(array)
{
}

template<class T>
T& Array2D<T>::Array1D::operator [](int index)
{
return m_array[index];
}

template<class T>
const T& Array2D<T>::Array1D::operator [](int index) const
{
return m_array[index];
}

////////////////////////////////////////////////////////////////
// Main
////////////////////////////////////////////////////////////////
int main()
{
Array2D<int> array(4,5);
array[0][0]=4;
return 0;
}
能不能把错误信息也贴出来?
在DEV-CPP中通过编译但是有两个警告,分别是
51 E:\DEV-CPP\Csdn_Qu4.cpp
[Warning] `typename Array2D<T>::Array1D' is 

57 E:\DEV-CPP\Csdn_Qu4.cpp
[Warning] `typename Array2D<T>::Array1D' is 

是类型暧昧不清,解决方法是 
template<class T>
typename Array2D<T>::Array1D     Array2D<T>::operator [](int index)
{
return Array1D(m_data+(index*m_demension2));
}

template<class T>
const typename Array2D<T>::Array1D  Array2D<T>::operator [](int index) const
{
return Array1D(m_data+(index*m_demension2));
}

在VC6。0中无法通过是由于嵌套类的类成员定义可能必须是在类体中定义,改成如下可以通过编译:
#include    <iostream>
using   std::ostream;

template<class T>
class Array2D
{
public:
Array2D(int dem1,int dem2);
~Array2D();

class Array1D
{
public:
Array1D(T* array): m_array( array ){}
T& operator[](int index) { return m_array[index]; }

const T& operator[](int index) const{ return m_array[index]; }


private:
T* m_array;
};

Array1D operator[](int index);
const Array1D operator[](int index) const;

private:
T* m_data;
int m_demension1;
int m_demension2;

};

////////////////////////////////////////////////////////////////
// Array2D<T>'s definition
////////////////////////////////////////////////////////////////
template<class T>
Array2D<T>::Array2D(int dem1,int dem2) : m_demension1(dem1),m_demension2(dem2),m_data(0)
{
m_data=new T[dem1*dem2];
}

template<class T>
Array2D<T>::~Array2D()
{
delete[] m_data;
}

template<class T>
typename Array2D<T>::Array1D     Array2D<T>::operator [](int index)
{
return Array1D(m_data+(index*m_demension2));
}

template<class T>
const typename Array2D<T>::Array1D  Array2D<T>::operator [](int index) const
{
return Array1D(m_data+(index*m_demension2));
}

int main()
{
Array2D<int> array(4,5);
array[0][0] = 4;
std::cout<< "array[ 0 ][ 0 ] = "<< array[ 0 ][ 0 ]<< std::endl;
system( "pause" );
return 0;
}



用Borland C++ 5.5 命令行方式编译,完全没有问题:

Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
test1.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

.NET的一个简单问题 C#测试问题 一个EXCEL进程的问题 为什么非要定义一个没用到的以P开头的指针? rol指令有什么用啊? 请问在。net中使用jdbc 如何连接是否需要安装jdk 阿? jsp:useBean如何取集合中的数据来自动填充??? 武汉武昌求购asp3高级编程 vc6如何调用.net的漂亮控件吗?? 如何让链接服务器支持嵌套事务? 手机gis引擎 c# 如何把应用程序窗口最小化至状态栏去了? WEB项目安装部署问题.在线等... MFC中设置字体的问题 简单查询语句(基础)???在线等!!! 在authoware中如何实现论坛???? 奇怪的session问题! 鸟在飞的时候会拉屎吗? 请问有软件测试方面的认证考试么? vb问题 做过操作系统课程设计的帮帮忙! eclipse和cc关联的插件是什么 救命啊!哪位大侠告诉我AddHandler的用法。MSDN实在看不懂 导出类的问题(类中有容器) vb调用Microsoft 基础类应用程序出错? datagrid删除功能? 如何根据xml里节点的值在xsl引用javascript? 有没有高手指点一下EhLib怎么用 谁是高手!!! |M| 母版页里面的页面怎么来添加一个Form啊