ошибка в коде c ++ "ожидаемый конструктор, деструктор или преобразование типов перед символом‘ (’('’’") и "нет соответствующей функции для вызова ..." - PullRequest
4 голосов
/ 09 июля 2011

действительно пытается решить ошибки, дважды проверил все. пожалуйста помоги. Новичок в C ++, будьте добры.

заголовочный файл (.h)

#ifndef GUARD_Optimized_quick_sort_h
#define GUARD_Optimized_quick_sort_h

#include <vector>
#include <list>
#include <iterator>

using namespace std;

template <class T> class optimized_quick_sort 
{
    public:
        optimized_quick_sort(vector<T> array) 
        {
            this->array = array;
        }

        optimized_quick_sort(list<T> array)
        {
            vector<T> temp(array.begin(), array.end());
            this->array = temp;
        }

        vector<T> sort()
        {
            typename vector<T>::iterator begin = array.begin();
            typename vector<T>::iterator end = array.end();

            quick_sort(begin, end);
            return array;
        }

    private:

        vector<T> array;


        int quick_sort( vector<T>::iterator , vector<T>::iterator);
        int insertion_sort(vector<T>::iterator, vector<T>::iterator);
        vector<T>::size_type devide(vector<T>::iterator, vector<T>::iterator );
};

#endif

.cpp файл

#include "optimized_quick_sort.h"

#include <iostream>
 using namespace std;

template <class T>
optimized_quick_sort<T>::quick_sort( vector<T>::iterator begin, vector<T>::iterator end)
{

    if(iterator::distance(begin, end) <= 5)
    {
        this->insertion_sort(begin, end);
    }
    else 
    {

        typename vector<T>::size_type devider;

        devider = devide(begin, end);

        quick_sort(begin + (devider+1),end);
        quick_sort(begin,begin + (devider-1));
    }

    return 1;
}

template <class T>
optimized_quick_sort<T>::devide(vector<T>::iterator begin, vector<T>::iterator end)
{
    return distance(begin, end)/2;
}

template <class T>
optimized_quick_sort<T>::insertion_sort(vector<T>::iterator begin, vector<T>::iterator end)
{
    return 1;

}

int main(int argc, char* argv[])
{ 
    vector<int> vec;
    int temp;
    while(cin >> temp)
        vec.push_back(temp);

    list<int> l(vec.begin(),vec.end());

    optimized_quick_sort<int> obj = optimized_quick_sort<int>(l);

    vec = obj.sort();

    vector<int>::iterator iter = vec.begin() ;

    while(iter != vec.end())
        cout << *iter++;

    cout << endl;
    return 1;
}

ошибка:

optimized_quick_sort.cpp:7: error: expected constructor, destructor, or type conversion before ‘(’ token

optimized_quick_sort.cpp:29: error: expected constructor, destructor, or type conversion before ‘(’ token

optimized_quick_sort.cpp:35: error: expected constructor, destructor, or type conversion before ‘(’ token

optimized_quick_sort.h: In member function ‘std::vector<T, std::allocator<_CharT> > 
optimized_quick_sort<T>::sort() [with T = int]’:

optimized_quick_sort.cpp:52:   instantiated from here

optimized_quick_sort.h:29: error: no matching function for call to ‘optimized_quick_sort<int>::quick_sort(__gnu_cxx::__normal_iterator<int*, std::vector<int, 
std::allocator<int> > >&, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&)’

optimized_quick_sort.h:38: note: candidates are: int optimized_quick_sort<T>::quick_sort(int&, int&) [with T = int]

Ответы [ 3 ]

5 голосов
/ 09 июля 2011

Вам не хватает типа возвращаемого значения во всех ваших реализациях функций, а также немного typename для итераторов, например:

template <class T>
int optimized_quick_sort<T>::quick_sort( typename vector<T>::iterator begin, typename vector<T>::iterator end)
^^^                                      ^^^^^^^^                            ^^^^^^^^
{
  // ...
}

Кроме того, в качестве подсказки проекта, непосредственно инициализируйтевещи в инициализаторе ctor:

optimized_quick_sort(vector<T> array)
  : array(array)
{ //^^^^^
}

optimized_quick_sort(list<T> array)
  : array(array.begin(), array.end())
{ //^^^^^
}
5 голосов
/ 09 июля 2011

Вам нужно ключевое слово typename :

int optimized_quick_sort<T>::quick_sort(
             typename vector<T>::iterator begin,
             typename vector<T>::iterator end)
{
      ...
}

Кроме того, кто сказал, что итератор - это класс, на котором вы можете использовать ::?Это может быть просто указатель.

iterator::distance(begin, end) <= 5

расстояние находится в пространстве имен std, а не в классе итераторов.

std::distance(begin, end) <= 5
2 голосов
/ 09 июля 2011

В дополнение к тому, что Армен и Xeo указали вам о typename, вы также должны хранить свою реализацию ваших методов класса в том же файле, что и объявления классов (все в одном заголовке).

Другими словами, переместите GUARDOptimizedquicksort.cpp в GUARDOptimizedquicksort.h и удалите файл .cpp из своего проекта.

Подробнее см. C ++ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...