代码之家  ›  专栏  ›  技术社区  ›  Uday

如何定义不同文件中存在的同名函数

c++
  •  2
  • Uday  · 技术社区  · 17 年前

    我想定义一个这样的类

    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 回复  |  直到 17 年前
        1
  •  3
  •   Glen    17 年前

    宏完全忽略作用域。

    基本上,预处理器会用updateResource来查找/替换updateResource,这样你就走运了。

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

        2
  •  5
  •   Matthew Flaschen    17 年前

    只是取消定义:

     #undef UpdateResource
    

    如果你真的需要的话,以后再重新定义。

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

        3
  •  1
  •   sharptooth    17 年前

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

        4
  •  1
  •   Patrick    17 年前

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

        5
  •  0
  •   Sasha    17 年前

    啊,这就是预处理器的坏处!

        6
  •  0
  •   heavyd    17 年前

    在声明函数之前,可以使用undef预处理器指令取消定义updateResource宏。

        7
  •  0
  •   James Hopkin    17 年前

    一种方法是记录 如果 包含winbase.h,必须在此头之前包含。通常这是一个可怕的要求,但是对于Windows报头,如果不首先包含它们(通常在预编译报头中,如@sharptouth所说),那么您将面临一个痛苦的世界。

    完成了,把这个放在你的头上:

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

    任何同时需要原始定义的人 UpdateResource 你的班级只需要

    #pragma pop_macro("UpdateResource")
    
        8
  •  -2
  •   user122302    17 年前

    名称空间是一种方法。