gcc中编译模版类继承的问题
首先:
Using built-in specs.
Target: i686-pc-cygwin
Thread model: posix
gcc version 4.1.0
对于下面的代码(库函数和程序所依赖的类定义都正确):
---------------------------------------------------------
template <class Graph>
class SEARCH
{
public:
SEARCH(const Graph &g):g(g), ord(g.V(), -1), cnt(0)
{
}
int operator [](int v) const
{
return ord[v];
}
protected:
virtual void searchC(Edge e) = 0;
void search()
{
for(int v = 0; v < g.V(); ++v)
{
if(-1 == ord[v]) searchC(Edge(v, v));
}
}
const Graph &g;
vector <int> ord;
int cnt;
};
template <class Graph>
class DFS : public SEARCH<Graph>
{
public:
DFS(const Graph &g):SEARCH<Graph>(g), st(g.V(), -1)
{
search();
}
int ST(int v) const
{
return st[v];
}
private:
virtual void searchC(Edge e)
{
int v = e.v, w = e.w;
ord[w] = cnt++;
st[w] = v;
typename Graph::adjIterator iters(g, w);
for(int n = iters.beg(); !iters.end(); n = iters.nxt())
{
if(-1 == ord[n]) searchC(Edge(w, n));
}
}
vector <int> st;
};
---------------------------------------------------------
用命令
$ g++41 -g main.cpp -o graph
得到一下编译错误提示:
-------------------------------------
search.h: In constructor 'DFS<Graph>::DFS(const Graph&)':
search.h:83: error: no matching function for call to 'search()'
search.h: In member function 'virtual void DFS<Graph>::searchC(Edge)':
search.h:93: error: 'ord' was not declared in this scope
search.h:93: error: 'cnt' was not declared in this scope
search.h:95: error: 'g' was not declared in this scope
search.h: In constructor 'DFS<Graph>::DFS(const Graph&) [with Graph = sparseGraph]':
search_test.h:38: instantiated from here
search.h:83: error: no matching function for call to 'search()'
-------------------------------------
好像是基模版类中的成员(public 或者 protected成员)在继承类中不能直接访问, 尝试在每个成员访问之前用基类类域修饰之后能通过编译!
同样的代码在vc6中确没有这个问题, 不知道应该怎么解释, 谢谢