【问题标题】:Class typename doesn't work类类型名不起作用
【发布时间】:2013-05-31 14:17:00
【问题描述】:

请告诉我代码有什么问题以及我应该更改什么来修复它(我收到编译错误):

#include <algorithm>
#include <cstring>
using namespace std;

const int MMAX = 1000001;


//--------------------------------------------------------------------------------------------
    inline bool comp(int &A, int &B) {
        if (A < B) return true;
        return false;
    }
template<typename _CompareFunction>
    struct myHeap { // min-heap
    _CompareFunction cmp;
    };
//--------------------------------------------------------------------------------------------

myHeap< comp > H;

int main() {

}

非常感谢!

编辑: 编译错误:

heap_minimal.cpp:19:15: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _CompareFunction> struct myHeap’
heap_minimal.cpp:19:15: error:   expected a type, got ‘comp’
heap_minimal.cpp:19:18: error: invalid type in declaration before ‘;’ token

(用 C++11 编译)

【问题讨论】:

  • 把你要问的代码放在这个网站上。
  • 没有人会阅读整个存储库。请将代码放在这里并将它产生的错误告诉我们,以便我们为您提供帮助。 sscce.org
  • 并粘贴编译器错误
  • 我已经编辑了 OP 的帖子添加了代码,希望没问题...
  • 你想完成什么?

标签: c++ class function typename


【解决方案1】:
myHeap< comp > H;

您应该将类​​型作为模板参数传递,而不是函数。将声明更改为以下内容:

myHeap<std::function<bool(int&, int&)>> H{comp};

或者

myHeap<decltype(comp)*> H{comp};

如果你想传递模板参数(不传递函数),你应该用重载的operator()声明类MyComp:

struct MyComp
{
    bool operator() (int &A, int &B)
    {
        // if (A < B) return true;
        // return false;
        return A < B;
    }
};

然后只是作为参数传递:

myHeap<MyComp> H;

【讨论】:

  • 然后连代码都行不通。或者不像他所期望的那样。
  • 好的,但是如果你曾经实现了一个priority_queue,那么你就有了priority_queue, CompareFunction>……我想要 CompareFunction 也可以在我这里工作。我该如何实现?
  • CompareFunction 这里是一个重载了operator()的类。
  • @Vlad CompareFunction 也可以是非成员函数,如您的示例所示。你只需要传递一个接受两个整数并返回一个bool的函数的类型。
【解决方案2】:

这里的问题是在模板定义中

template<typename _CompareFunction>

_CompareFunction 是一个 type,但你尝试在其中使用 comp function。但是你需要一个类型,所以你可以像这样修复错误:

myHeap< bool (*)(int&, int&) > H;

之所以有效,是因为 bool (*)(int&, int&) 是您的 comp 函数的一种类型。 或者,您可以定义您的 myHeap 以将函数作为模板参数

template <bool (*fun)(int&, int&)>
struct myHeap2 
{      
};

然后你就可以这样使用了

myHeap2<comp> H2;

【讨论】:

    【解决方案3】:

    你应该定义一个类型使用“typedef bool (*comp)(int&, int&);”语句,然后通过将 comp 类型作为模板参数传递来声明类,如您的代码:myHeap H;

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 2018-01-08
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多