如何定义具有相同名称的函数,该函数存在于不同的文件中

时间:2009-06-16 13:15:36

标签: c++

我想定义一个这样的类

class HttpRestAccessor
{
public:
    IResource& UpdateResource(string& , IResource& );
};

并在cpp文件中实现

IResource& HttpRestAccessor::UpdateResource(string& resourceUri, IResource& resource)

这个cpp文件是指Winbase.h,它定义了UpdateResource,如下所示

#define UpdateResource  UpdateResourceW

因此在编译时我得到以下错误

错误C2039:'UpdateResourceW':不是'RestToolkit :: HttpRestAccessor'的成员

如果将函数名称重命名为不同的名称,则可以解决此问题。 但我希望将我的函数名称保留为UpdateResource。

先谢谢, 乌代

8 个答案:

答案 0 :(得分:5)

只是取消定义它:

 #undef UpdateResource

如果你真的需要它,那么之后再重新定义。

编辑:但是,您应该重新考虑您对重命名方法的厌恶。正如其他人所说,这是一个更优雅的解决方案。

答案 1 :(得分:3)

宏完全忽略范围。

基本上,前任前任将使用UpdateResourceW查找/替换UpdateResource,所以你们都运气不好。

重命名方法是您唯一的选择

答案 2 :(得分:1)

最简单的方法是在所有其他标头(在stdafx.h中)之前包含winbase.h,这样你就不必关心方法名称是否被替换。

答案 3 :(得分:1)

重命名您的功能。如果你想使用windows库,那么你必须接受它们优先,你永远不会尝试创建一个名为std :: string的类吗?

答案 4 :(得分:0)

呃,那是预处理器的邪恶!

答案 5 :(得分:0)

您可以使用#undef预处理程序指令在声明函数之前取消定义UpdateResource宏。

答案 6 :(得分:0)

一种方法是记录如果包含 Winbase.h,它必须包含在此标头之前。通常情况下这将是一个可怕的要求,但是对于Windows标题,除非您首先包含它们(通常在预编译的标题中,正如@sharptooth所说),否则它几乎是一个让您感到痛苦的世界。

完成后,将其放在标题中:

#ifdef UpdateResource
#pragma push_macro("UpdateResource")
#undef UpdateResource
#endif

任何人同时需要UpdateResource的原始定义,而您的班级只需要输入

#pragma pop_macro("UpdateResource")

答案 7 :(得分:-2)

命名空间是可行的方法。