2013-05-31 4 views
-3

Пожалуйста, скажите мне, что случилось в коде и что я должен изменить, чтобы исправить это (я получаю ошибку компиляции):Класс имяТипа не работает

#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() { 

} 

Большое спасибо заранее!

Edit: Ошибка компиляции:

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)

+0

Поместите код вы просите о здесь на этом сайте. –

+0

Никто не собирается читать целый репозиторий. Пожалуйста, разместите здесь код и дайте нам ошибки, которые он производит, чтобы мы могли вам помочь. http://sscce.org/ – Salgar

+0

и вставить ошибку компилятора тоже –

ответ

1
myHeap<comp> H; 

Вы должны передать тип в качестве параметра шаблона, а не функции. Измените объявление на следующее:

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

Или

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

Если вы хотите передать только параметр шаблона (без прохождения функции), вы должны объявить класс MYCOMP с перегруженным operator():

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

А затем просто введите в качестве параметра:

+0

, а затем даже код не будет работать. Или не так, как он ожидал. – rubenvb

+0

Хорошо, но если вы когда-либо реализовали priority_queue, там у вас было ** priority_queue , CompareFunction> ** например ... Я хочу, чтобы ** CompareFunction ** работала и на меня. Как это реализовать? –

+0

'CompareFunction' - это класс с перегруженным' operator() '. – soon

0

вы должны определить тип использования «typedef bool (* comp) (int &, int &); и затем объявить класс, передав тип comp в качестве параметра шаблона, например, ваш код: myHeap < comp> H;

1

Проблема у вас есть в том, что в определении шаблона

template<typename _CompareFunction> 

_CompareFunction является типа, но вы пытаетесь использовать комп функцию в нем. Но вам нужен тип, так что вы можете исправить ошибку следующим образом:

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

, что работает, потому что BOOL (*) (INT &, INT &) представляет собой тип вашей функции ср. Кроме того, вы можете определить myHeap взять функцию в качестве параметра шаблона

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

И тогда вы можете использовать его как этот

myHeap2<comp> H2; 
Смежные вопросы