c++ - 将 C++ 模板从 GCC 移植到 Visual C++ 时出错

标签 c++ visual-c++ templates gcc

以下在 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/

相关文章:

c++ - 如何检查函数参数的类型?

c++ - 函数/仿函数作为模板参数。它们可以储存吗?

c++ - 迷失在指针世界,通过数组写入变量

c++ - 获取消息到 DebugView

C++ 使用较新编译器的功能生成代码以供较旧编译器使用

c++ - 从 vc6 dll 创建 wstring 时出现错误指针或链接问题

C++ Vector Template Per-Component 操作

c++ - 没有 OpenGL 的重复 OpenGL 正交投影行为

c++ - 异常代码 C++ 中的泄漏

c++ - std::bind 和函数模板