Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

Не компилируется: что не так с конструктором структуры? - C++

11.04.2012, 23:43. Просмотров 1079. Ответов 7
Метки нет (Все метки)

Есть некий класс - односвязный линейный список, с элементами типа TElem. Шаблонность здесь только чтобы хранить различные объекты в списке и собственно эта же шаблонность и приводит к ошибке при компиляции.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
template <class T>
CSparseArray
{
    CSparseArray()
    :size(0)
    {
        m_First= NULL;
        m_Last= NULL;
    }
 
    CSparseArray& Set(int index, const T& value)
    {
        if(size==0)
        {
            m_First= m_Last= new TElem(index, value);
            size++;
            return *this;
        }
    /// здесь много всего, но не буду приводить это
     }
 
   protected:
    struct TElem
    {
    TElem(const int& index,const T& value, TElem* const next= 0)
    {
        m_Idx= index;
        m_Val= value;
        m_Next= next;
    }
 
    TElem* m_Next;
    int m_Idx;
    T m_Val;
    };
 
 
    TElem* m_First;
    TElem* m_Last;
    int size;
};
Проблемы с стандартными типами нет, а вот с вот таким вот (искусственно созданный пример приводящий к ошибке компиляции):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class CInt
{
public:
    CInt(int x)
    :data(x){}
 
    CInt(const CInt& obj)
    {
        data=obj.data;
    }
 
    bool operator<(const CInt& right) const
    {
        return data<right.data;
    }
 
    bool operator==(const CInt& right) const
    {
        return data==right.data;
    }
 
    friend ostream& operator<<(ostream& os, const CInt& print)
    {
        return os<<print.data;
    }
private:
    int data;
};
и тут же main:
C++
1
2
3
4
5
6
int main()
{
    CSparseArray<CInt> ZZ;
    CInt obj(100);
    ZZ. Set(100,obj);
}
Сразу же будут вот такие ошибки, связанные с тем что в методе Set при создании нового объекта
C++
1
m_First= m_Last= new TElem(index, value);
и вызове моего конструктора для типа TElem
C++
1
TElem(const int& index,const T& value, TElem* const next= 0)
Не найдётся подходящий конструктор для типа CInt, но почему это не найдётся?
C++
1
2
3
error: no matching function for call to 'CInt::CInt()'|
|note: candidates are: CInt::CInt(const CInt&)|
note:                 CInt::CInt(int)|
Полный лог ошибки:
Код
||=== Debug ===|
main.cpp||In constructor 'CSparseArray<T>::TElem::TElem(const int&, const T&, CSparseArray<T>::TElem*) [with T = CInt]':|
main.cpp|82|instantiated from 'CSparseArray<T>& CSparseArray<T>::Set(int, const T&) [with T = CInt]'|
main.cpp|379|instantiated from here|
main.cpp|298|error: no matching function for call to 'CInt::CInt()'|
main.cpp|347|note: candidates are: CInt::CInt(const CInt&)|
main.cpp|344|note:                 CInt::CInt(int)|
||=== Build finished: 1 errors, 0 warnings ===|
Что я делаю не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2012, 23:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не компилируется: что не так с конструктором структуры? (C++):

что не так с конструктором с параметрами - C++
создаю экземпляры класса , один через конструктор с параметрами но указываю параметрами он мне пишет ошибка что преобразования типов не...

Что не так с кодом? Компилируется, но не работает (связные списки) - C++
#include &quot;stdio.h&quot; #include &quot;stdlib.h&quot; #include &lt;string.h&gt; #include &quot;iostream&quot; using namespace std; class Elem { ...

Что-то с конструктором - C++
Задача: написать программу бюджета, есть два типа счета, у каждого свои параметры пополнения и снятия. Место вывода баланса только что...

классы непойму что с конструктором - C++
привет вот создал такой класс но чето конструктор ругается но что непойму( #include &lt;iostream&gt; #include &lt;string&gt; using namespace...

Не компилируется код с именем структуры без заглавной первой буквы - C++
Почему компилятор не компилирует код с именем структуры, которое начинается со строчной буквы? Linux (Ubuntu 12.04). Компилятор gcc,...

Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? - C++
Ничего нельзя. Итак, новичкам напомню, что после выполнения кода FILE* f= fopen (&quot;file.txt&quot;, &quot;w&quot;); в переменной f содержится...

7
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
12.04.2012, 00:04 #2
Подозреваю, что компилятору не хватает конструктора по умолчанию.
1
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
12.04.2012, 00:06  [ТС] #3
Тьфу, вот я затупил же. Не умею я читать ошибки компилятора раз пол часа сидел думал, решение очевидно же:
C++
1
2
3
4
5
6
    TElem(const int& index,const T& value, TElem* const next= 0)
:m_Val(value)
    {
        m_Idx= index;
        m_Next= next;
    }
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
12.04.2012, 00:10  [ТС] #4
kazak, Беда же в том была что нельзя писать CInt, такой себе CInt кто-то без меня может написать и тыкнуть мне пальцем "Аяяяяй это не компилится"

Добавлено через 1 минуту
IPtv, забыл упомянуть что не CInt нельзя трогать, я его искусственно создал как проблемный, спрятать проблему не значит решить её
0
HighPredator
12.04.2012, 00:12
  #5

Не по теме:

Gepar, а ваш компилятор нормально переваривает это без ключевого слова class (строки 2-3)?

0
Gepar
12.04.2012, 03:37  [ТС]
  #6

Не по теме:

HighPredator, нет конечно, я кроме структуры сам код донабирал здесь в форме ответа на сообщение, слово class как-то упустить умудрился, не знаю как.

0
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.04.2012, 09:04 #7
Цитата Сообщение от Gepar Посмотреть сообщение
забыл упомянуть что не CInt нельзя трогать, я его искусственно создал как проблемный, спрятать проблему не значит решить её
Это глупости. Всегда есть некоторые правила, в данном случае это наличие конструктора. Посмотрите хотя бы на STL-контейнеры.

C++
1
std::vector<CInt> v(10);
Код
error: no matching function for call to 'CInt::CInt()'
note: candidates are:
note: CInt::CInt(const CInt&)
note:   candidate expects 1 argument, 0 provided
note: CInt::CInt(int)
note:   candidate expects 1 argument, 0 provided
При этом если просто создать контейнер, то все нормально.
C++
1
std::vector<CInt> v;
Все почему? Потому что контейнер должен знать, как ему создавать объекты. Мне что теперь бежать к комитету по стандартизации и кричать: "Ааааа, не компилируется!", так Вы себе это представляете?
1
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
13.04.2012, 11:41  [ТС] #8
Цитата Сообщение от fasked Посмотреть сообщение
Это глупости. Всегда есть некоторые правила, в данном случае это наличие конструктора.
Значит со мной играли не по правилам
0
13.04.2012, 11:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2012, 11:41
Привет! Вот еще темы с ответами:

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее? - C++
Вот код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(){ float a,c; char b; skip: ...

Что изменить в коде? Не компилируется - C++
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main() { cout&lt;&lt;&quot;Avtor: Tsapenko K.V. &quot;; ...

Что в коде ни так? while не работает так, как ожидаю - C++
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от 702 до 1000. Что ни так понимаю, где...

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) - C++
1) что происходит со старым конструктором когда я создаю новый, пренадлежащий производному классу? (первый конструктор пренадлежит базовому...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru