【问题标题】:Calling an "external" function from a class method从类方法调用“外部”函数
【发布时间】:2011-05-10 12:49:46
【问题描述】:

我有一个要从类方法中调用的函数。该函数位于名为 mergeSort.cpp 的文件中。这是实现该类的 .cpp 文件的 sn-p:

// other includes
#include "mergeSort.cpp"

// other methods
void Servers::sortSites() {
 mergeSort(server_sites.begin(), server_sites.end(), siteCompare);
}
// remaining methods 

当我尝试编译时,我收到错误提示找不到 mergeSort。我认为这是因为它试图调用 Servers::mergeSort。我将如何调用外部函数?

【问题讨论】:

    标签: c++ class function methods


    【解决方案1】:

    你必须使用“::”外部命名空间解析器:

    ::mergeSort(...);
    

    这告诉编译器在外部命名空间中查找函数。如果这个特定的函数是在另一个命名空间或类中定义的,你必须明确地指定它:

    Namespace::mergeSort(...);
    

    如果您不想每次使用时都完全解析名称,可以使用以下任一方法将名称导入当前命名空间:

    using namespace Namespace;
    

    using Namespace::mergeSort;
    

    (其中Namespace 是定义mergeShort() 的名称)。

    【讨论】:

      【解决方案2】:

      这里似乎有几个问题。首先,Servers::mergeSort 真的存在吗?你推测它正在寻找那个,但你实际上并没有说有这样的东西。如果没有,那不是问题。在这种情况下,它看不到 mergeSort 的一个可能原因是它不在全局命名空间中(正如其他答案所推测的那样)。如果Servers::mergeSort 确实存在,请查看 Diego 的回答。

      一个单独的问题是——因为 mergeSort 是一个模板,您是否包含 .cpp 文件(这通常有点奇怪)?如果不是,您可能应该包括随附的 .h 我猜。如果是,更常见的模式是在文件头中包含带有模板代码的文件,如下所示:

      // mergeSort.h
      // <Begin include guard
      
      // <Lots of header stuff>
      
      #include "mergeSort.tpp"
      
      // <End include guard>
      

      然后你在别处包含mergeSort.h,客户记住的就少了一件事。

      【讨论】:

        【解决方案3】:

        检查mergeSort() 是否在特定的namespace 中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-30
          • 2023-01-31
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-18
          • 1970-01-01
          相关资源
          最近更新 更多