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

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

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

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

11.04.2012, 23:43. Просмотров 933. Ответов 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 ===|
Что я делаю не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2012, 23:43     Не компилируется: что не так с конструктором структуры?
Посмотрите здесь:

C++ классы непойму что с конструктором
что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) C++
Компилируется в С++ bulder 6.0 но не компилируется в VS 2010 express C++
C++ Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
В формате .cpp код компилируется, а в .c не компилируется C++
C++ что не так с конструктором с параметрами
Что не так с кодом? Компилируется, но не работает (связные списки) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
3031 / 2352 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.04.2012, 00:04     Не компилируется: что не так с конструктором структуры? #2
Подозреваю, что компилятору не хватает конструктора по умолчанию.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
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;
    }
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
12.04.2012, 00:10  [ТС]     Не компилируется: что не так с конструктором структуры? #4
kazak, Беда же в том была что нельзя писать CInt, такой себе CInt кто-то без меня может написать и тыкнуть мне пальцем "Аяяяяй это не компилится"

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

Не по теме:

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

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

Не по теме:

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

fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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;
Все почему? Потому что контейнер должен знать, как ему создавать объекты. Мне что теперь бежать к комитету по стандартизации и кричать: "Ааааа, не компилируется!", так Вы себе это представляете?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2012, 11:41     Не компилируется: что не так с конструктором структуры?
Еще ссылки по теме:

C++ Не компилируется код с именем структуры без заглавной первой буквы
Что-то с конструктором C++
Всё компилируется, выводится, но не то что мне нужно C++
C++ Что в коде ни так? while не работает так, как ожидаю
C++ Раздельная компиляция: как быть, если код не компилируется, так как два файла подключают друг друга?

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

Или воспользуйтесь поиском по форуму:
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
13.04.2012, 11:41  [ТС]     Не компилируется: что не так с конструктором структуры? #8
Цитата Сообщение от fasked Посмотреть сообщение
Это глупости. Всегда есть некоторые правила, в данном случае это наличие конструктора.
Значит со мной играли не по правилам
Yandex
Объявления
13.04.2012, 11:41     Не компилируется: что не так с конструктором структуры?
Ответ Создать тему
Опции темы

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