微软VC++对友元类和模板的支持真的这么差吗?

微软VC++对友元类和模板的支持真的这么差吗?

以前写代码的时候就遇到VC++对友元支持得不太好的问题,同时也看过侯捷老师对gnu c++, VC++, BCB 三种编译器的比较,其中VC++对模板友元的支持就不是很好。
今天晚上写了一个比较简单的链表的模板类,其中头文件Chain.h原来的代码如下:

#include <iostream>
using namespace std;

#ifndef _CHAIN
#define _CHAIN

template<class T>
class ChainNode
{
 friend class Chain<T>;
private:
 T data;
 ChainNode<T> *link;
};

template<class T>
class Chain{
public:
 Chain()
 {
  first = 0;
 };
 ~Chain();
 bool IsEmpty() const {return first == 0;}
 int Length() const;
 bool Find(int k, T& x) const;
 int Search(const T& x) const;
 //Chain<T>& Delete(int k, T& x);
 Chain<T>& Insert(int k, const T& x);
 void Output(ostream& out = cout) const;
private:
 ChainNode<T> *first; // 指向第一个节点的指针
};

#endif  // _CHAIN

结果报错:
--------------------Configuration: Chain - Win32 Debug--------------------
Compiling...
Chain.cpp
g:\work plan\c++ code practice\chain\chain.h(17) : error C2059: syntax error : '<'
        g:\work plan\c++ code practice\chain\chain.h(21) : see reference to class template instantiation 'ChainNode<T>' being compiled
g:\work plan\c++ code practice\chain\chain.h(17) : error C2238: unexpected token(s) preceding ';'
        g:\work plan\c++ code practice\chain\chain.h(21) : see reference to class template instantiation 'ChainNode<T>' being compiled
g:\work plan\c++ code practice\chain\chain.h(40) : error C2989: 'Chain' : template class has already been defined as a non-template class
        g:\work plan\c++ code practice\chain\chain.h(17) : see declaration of 'Chain'
g:\work plan\c++ code practice\chain\chain.cpp(6) : error C2059: syntax error : '<'
g:\work plan\c++ code practice\chain\chain.cpp(6) : error C2588: '::~Chain' : illegal global destructor
g:\work plan\c++ code practice\chain\chain.cpp(6) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.

Chain.obj - 6 error(s), 0 warning(s)

感觉从代码来看应该是没有问题的,如果哪个高手看出问题来了请一定告诉我啊,如果知道编译不通过的原因也请一定要告诉我啊。没办法,最后采用解决的办法就是修改ChainNode的定义了,定义为结构体:)
template<class T>
struct ChainNode
{
  T data;
  ChainNode<T> *link;
};
反正结构体中的数据成员都是public的,至于访问限制的实现就依靠迭代器来实现了,g++的STL中的树结点不也是结构体吗?:)

你可能感兴趣的:(微软VC++对友元类和模板的支持真的这么差吗?)