我想定义一个这样的类
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。
先谢谢, 乌代
答案 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)
命名空间是可行的方法。