关于“C2989:类模板已经声明为非类模板”出错

该问题的主要原因是:


class C{};

template <class T>
class C{};  // C2989

从以上例子可以看出,当前面定了类C,又再一次定义类C为模板类,因此便出现了该问题;


当时我出错的代码是:

class A
{
friend class B;//出错主要原因:C2989
...
};

template<class T>
class B
{
...
};


问题出现在类A中,改正为:

class A
{
template<class T>
friend class B;
...
};


可以参考:http://msdn.microsoft.com/zh-cn/library/b25sbd9x.aspx



  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
包含定义代码和测试代码,代码不复杂,有注释,池对象存取时间复杂度为常数级,多线程测试速度可达千万次/秒。 使用方法如下: 1.定义池,例如: FastPool<std::string> pool; 2.往池添加对象,例如: pool.Add("abc");//要注意这里传入的是构造对象的参数 3.取出一个对象以使用,例如: std::string* p = pool.Pop(); 这一步可以跟上一步结合起来: std::string* p = pool.AddAndPop("123");//这时候p就指向"123"这个刚加入池的std::string对象 4.存回对象以重用,例如: pool.Release(p); 5.还有的时候需要删除池中的对象,例如: pool.Delete(p);//只删除一个对象 pool.DeleteNotUsed();//删除池中未使用的对象 pool.DeleteAll();//删除池中所有对象 上面的示例只是模板参数为std::string 时的用法。还有一些函数未列出。希望代码能给大家带来启发。 重新检查了一次,发现模板代码中区分类和基本数据类型的代码用到了另外自定义的库。需要做如下修改: #include<type_traits> //先定义一个模板用以区分类和基本数据类型的行为 template<class TT, bool val>struct ChangeClass {typedef typename TT Type;}; template<class TT>struct ChangeClass<TT,false> {typedef typename std::vector<void*> Type;}; 然后代码中的 typedef typename LK::Templates::UseT<LK::Templates::IsClassOrUnion<T>::value, std::vector<void>, T>::type TP; if (LK::Templates::IsClassOrUnion<T>::value) 改为: typedef typename ChangeClass<T, std::is_class<T>::value>::Type TP;//防止类调用析构函数导致的错误 if (std::is_class<T>::value) 最后,欢迎喜欢编程的伙伴来qq群244953928探讨O(∩_∩)O

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值