c++中操作符重载是不是不支持特化?高手看看

BlueDog 2009-09-06 11:31:52
template<typename T>
bool foo(const T lhs,const T rhs)
{
return lhs < rhs;
}


template<>
bool foo(const char* lhs,const char* rhs)
{
return strcmp(lhs,rhs);
}

这个代码是可以的,但是如果改成operator<则报错

template<>
bool operator< <char*>(const char* lhs,const char* rhs) //c2919 error

改成
template<>
bool operator< (const char* lhs,const char* rhs) //c2803 error

我记得好象用template或typename好象可以说明
但以下两种也不对
template<>
bool operator< template<char*>(const char* lhs,const char* rhs) //error

template<>
bool operator< typename<char*>(const char* lhs,const char* rhs) //error

《c++程序语言设计》中也没说明是否充许操作符重载函数进行特化?
它只给出一个less的例子,看来c++之父对于这个问题也不清楚,呵呵







...全文
215 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueDog 2009-09-08
  • 打赏
  • 举报
回复
1、你的问题不在模板,而是操作符不能全是指针的问题

操作符可以是指针,当用普通函数特化时完全可行

我想对于重载符特化是否可以
要么是c++标准不充许,或没说清楚
要么是编译器不支持。


2、谢谢了,找这个__if_exists,找了好久,一直都没找到合适的办法。呵呵
虽然只有ms支持它,不过它的实现实在比用模板好多了。
而且它是编译期的。呵呵

结帐了!
BlueDog 2009-09-07
  • 打赏
  • 举报
回复
高手有蛮多,不过大家好象没有用编译器试试

1、可以用 typedef char* LPCHAR 来绕过指针的问题
2、其实用 int 也不行

我用的是vc7.1(vs2003)
xwsn007 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jameshooo 的回复:]
对于运算符重载,不可以两个参数都是指针类型,至少有一个参数应该是类或者类的引用,例如
class A{};
bool operator < (const char*, const char*); 错误
bool operator < (const A*, const char*); 错误
bool operator < (const A, const char*); OK
bool operator < (const A&, const char*); OK
[/Quote]

原来如此!
xwsn007 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jameshooo 的回复:]
操作符重载也可以特化,但是只能使用隐性写法,不能像函数模板那样使用显性写法,例如
template <typename T>
bool operator < (const A&, const T);

template <>
bool operator < <char*> (const A&, const char*); 错误,普通函数模板的特化才可以这样用显式特化参数列表
template <>
bool operator < (const A&, const char*); OK
[/Quote]

正解
freeliving_wf 2009-09-07
  • 打赏
  • 举报
回复
学习学习········
#Page# 2009-09-07
  • 打赏
  • 举报
回复
楼上所言极是
jameshooo 2009-09-07
  • 打赏
  • 举报
回复
操作符重载也可以特化,但是只能使用隐性写法,不能像函数模板那样使用显性写法,例如
template<typename T>
bool operator < (const A&, const T);

template<>
bool operator < <char*> (const A&, const char*); 错误,普通函数模板的特化才可以这样用显式特化参数列表
template<>
bool operator < (const A&, const char*); OK
jameshooo 2009-09-07
  • 打赏
  • 举报
回复
对于运算符重载,不可以两个参数都是指针类型,至少有一个参数应该是类或者类的引用,例如
class A{};
bool operator< (const char*, const char*); 错误
bool operator< (const A*, const char*); 错误
bool operator< (const A, const char*); OK
bool operator< (const A&, const char*); OK
chenyu2202863 2009-09-07
  • 打赏
  • 举报
回复
噢,看来重载操作符不支持特化~以前没遇过,待会试试~
jyh_baoding 2009-09-07
  • 打赏
  • 举报
回复
不明白,帮顶
feilinhe 2009-09-07
  • 打赏
  • 举报
回复
c++的泛型编程还是有限的,不是c++之父不明白,是当年他设计的时候没考虑那么多,没考虑那么人性化,别忘了Andrei Alexandrescu写了《Modern C++ Design》之后人们才真正领悟到了c++模板编程的魅力,这是c++之父都没想到的
MoXiaoRab 2009-09-07
  • 打赏
  • 举报
回复
特化要视操作对象而言,它不是C#,泛型没那么强大,什么都能比
BlueDog 2009-09-07
  • 打赏
  • 举报
回复
top
jameshooo 2009-09-07
  • 打赏
  • 举报
回复
1、你的问题不在模板,而是操作符不能全是指针的问题

2、编译期可以判断某个类是否有某个方法
__if_exists(cfoo::sort) { ... }
__if_not_exists(cfoo::sort) { ... }
BlueDog 2009-09-07
  • 打赏
  • 举报
回复
我想问问就是有没有人知道什么地方,比如c++标准提出不充许这样的特化

如果没有的话,我想实现这样的特化有没有这样的写法

应该typename支持这样的写法


另法还有一个关于模板的问题

如何实现在编译期知道某个类支持某个方法,貌视boost好象实现了




struct cfoo
{
void sort(void);
};

我假设这个关键字叫has_member

bool flag = has_member<sort,void(*ptr)()>;











BlueDog 2009-09-07
  • 打赏
  • 举报
回复
机器太烂没装vs2008

jameshooo 2009-09-07
  • 打赏
  • 举报
回复
我都试过了,VS2008,typedef无用,最终都要替换成原始类型

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧