以下在 GCC 中编译:
cvec.hpp:
template <class T>
class cvec : public deque<T>
{
class deque<T>::iterator Find(T);
};
cvec.cpp:
template <class T>
class deque<T>::iterator cvec<T>::Find(T element)
{
}
在 Visual C++ 中,获取:
错误 C2242“typedef 名称不能跟在类/结构/union 之后。
我将头文件中的“class”更改为“typename”,但收到错误 C3860 - 模板参数列表必须按照模板参数列表中使用的顺序列出参数。在这种情况下只有一个参数 T。除非编译器对 Find(T element) 感到困惑?
最佳答案
标题中的这应该是什么意思:
class deque<T>::iterator Find(T);
你不是在声明一个类。 typename
关键字在这里是有效的,但是 class
没有意义。
.cpp文件中也是如此:
template <class T>
typename deque<T>::iterator cvec<T>::Find(T element)
是正确的,class
不是。
除此之外,您尝试做的事情看起来确实是一个可怕的想法。 std::deque
已经有一个 find
函数。有用。它是正确的。这是有效的。无需重新发明它。
标准库容器也不是为派生而设计的。他们没有虚拟析构函数。
你所取得的成就(除了编译错误)是你最终会得到一个有缺陷、效率低下的容器类,这会使其他 C++ 程序员感到困惑,因为它不使用惯用的接口(interface)。
关于c++ - 将 C++ 模板从 GCC 移植到 Visual C++ 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3406686/