类型名称不起作用

时间:2013-05-31 14:17:01

标签: c++ class function typename

请告诉我代码有什么问题,我应该修改什么来解决它(我收到编译错误):

#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编译)

3 个答案:

答案 0 :(得分:1)

myHeap< comp > H;

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

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

或者

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

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

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

然后只传递参数:

myHeap<MyComp> H;

答案 1 :(得分:1)

您遇到的问题是模板定义

template<typename _CompareFunction>

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

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

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

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

然后你可以像这样使用它

myHeap2<comp> H2;

答案 2 :(得分:0)

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