【发布时间】:2011-03-25 07:35:06
【问题描述】:
以下在 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++ 中,获取:
error C2242 "typedef name 不能跟随 class/struct/union。
我将头文件中的“类”更改为“类型名”,但收到错误 C3860 - 模板参数列表必须按照模板参数列表中使用的顺序列出参数。在这种情况下只有一个参数,T。除非编译器对 Find(T element) 感到困惑?
【问题讨论】:
-
class和typename在这种情况下不可互换。class在那里不合法。 -
从
std::deque派生也是一个糟糕的主意,尤其是如果只是这样你就可以输入deque.Find(x)而不是使用std::find。 -
@jalf:为什么从 std::deque 派生通常是个坏主意?
-
@dvl:这是不安全的,因为标准容器没有虚拟析构函数。如果您不小心,您将在删除时调用未定义的行为。这也是一个坏主意,因为它会使其他用户感到困惑。类的扩展应该通过非成员函数进行,而不是仅仅为了添加成员而派生(使用
std::find而不是添加myhomemadedeque.Find。
标签: c++ visual-c++ templates gcc