Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для lebowski228
0 / 0 / 0
Регистрация: 27.10.2018
Сообщений: 3

Ошибки компоновщика

03.11.2018, 01:27. Показов 587. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предупреждаю сразу, я новенький. Пишу курсач по структурам данных на C++/CLI, уже второй мой курсач на этом языке. Если что, все происходит в Visual Studio 2017. Необходимо реализовать ассоциативный массив (map) на динамическом массиве. Однако проблема не столько в реализации, сколько в ошибках компоновщика, каждый раз преследующих меня при программировании на этом языке.

Вот, собственно, заголовочный файл структуры, MyMap.h:

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
#pragma once
template <class Key_Type, class Value_Type>
ref class MyMap
{
    ref struct Node
    {
        Key_Type key;
        Value_Type value;
    };
 
public:
    
    System::String^ name;
    array<Node^>^ arr;
    MyMap();
 
    Value_Type operator[] (Key_Type key)
    {
        for (int i = 0; i < arr.Length; i++)
            if (arr[i].key == key)
                return arr[i].value;
        throw System::IndexOutOfRangeException();
    }
 
    bool insert(Key_Type key, Value_Type value);
    void erase(Key_Type key);
    bool change(Key_Type key, Value_Type value);
    void sort();
};
 
template<class Key_Type, class Value_Type>
inline MyMap<Key_Type, Value_Type>::MyMap()
{
    arr = gcnew array<Node^>(0);
}
С моей стороны будет очень интимно показывать MyMap.cpp, потому что, возможно, там все эти функции определены криво. Но дело не в этом. В классе формы определен список словарей, так сказать:

C++
1
static List<MyMap<String^, Consumer>^>^ data = gcnew List<MyMap<String^, Consumer>^>();
Consumer - мой класс, пока не важно. Так вот, при попытке обратиться к полю arr

C++
1
data[listBoxMaps->SelectedIndex]->arr[0]->key;
возникают ошибки компоновщика:



При этом, если массив arr содержит не Node, а int, то никаких ошибок не возникает, соответственно логично предположить, что проблема только в структуре Node. Один мой товарищ говорил мне, что для управляемого кода правильнее использовать value class, нежели чем ref struct. Я, откровенно говоря, уже не знаю, работают ли с ошибками компоновки законы логики. Вот к примеру: не трудно заметить, что в моем коде конструктор класса MyMap лежит в h файле, а не в cpp. Хотя еще недавно он лежал у меня в cpp, на что я получил:



По приколу переместил его в h файл, а ошибка исчезла. Хотя я не представляю, ни откуда взялись ошибки, ни, почему сие действие привело к их исчезновению.

Однако, сидеть сложа ручки я не стал, и создал другой VS проект, уже консольный, в котором описал MyMap.h (тут есть некоторые видоизменения, особенно в виде управляемых ссылок в Node, которых доселе не было):

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
#pragma once
template <class Key_Type, class Value_Type>
ref class MyMap
{
    ref struct Node
    {
        Key_Type^ key;
        Value_Type^ value;
    };
 
public:
 
    System::String^ name;
    array<Node^>^ arr;
    MyMap();
 
    Value_Type^ operator[] (Key_Type^ key)
    {
        for (int i = 0; i < arr.Length; i++)
            if (arr[i].key == key)
                return arr[i].value;
        throw System::IndexOutOfRangeException();
    }
 
    bool insert(Key_Type^ key, Value_Type^ value);
    void erase(Key_Type^ key);
    bool change(Key_Type^ key, Value_Type^ value);
    void sort();
};
 
template<class Key_Type, class Value_Type>
inline MyMap<Key_Type, Value_Type>::MyMap()
{
    arr = gcnew array<Node^>(0);
}
И вот MyMapTest.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include "MyMap.h"
using namespace System;
 
int main(array<System::String ^> ^args)
{
    MyMap<String, String>^ a = gcnew MyMap<String, String>();
    a->arr[0]->key;
 
    return 0;
}
Данный пример компилируется. И казалось бы, зачем я все это пишу, если я уже могу с радостными криками вставлять код из нового MyMap.h в старый? А тут:



В общем, вопрос мой даже не про мои проблемы, подобные ошибки у меня возникали и в прошлом курсаче. Есть ли какой-нибудь универсальный способ борьбы с этими ошибками компоновщика? А то не радует меня перспектива с каждой из них сидеть неделю. Вы, конечно, будете справедливы, если отправите меня в гугл с запросом "ошибки компоновщика в C++/CLI", но там в основном, вроде, только MSDN документация и вопросы на форумах по конкретным ошибкам.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2018, 01:27
Ответы с готовыми решениями:

Ошибки компоновщика . подскажите что добавить
Есть такой код, работа с сокетами Сыпет ошибками компоновщика Подскажите в чем дело ? #include &lt;string.h&gt; #include...

Непонятное описание ошибок компоновщика
Учусь в универе на первом курсе. Изучаем C++ и пишем простенькие программы. Дали лабораторную работу по разработке приложения Windows...

Как избавиться от ошибки компоновщика?
Как избавиться от ошибки компоновщика в vs2008? Сначала вылезала в мфц проектах, а теперь уже везде. Переустановка не помогает

2
 Аватар для lebowski228
0 / 0 / 0
Регистрация: 27.10.2018
Сообщений: 3
03.11.2018, 02:36  [ТС]
Цитата Сообщение от lebowski228 Посмотреть сообщение
универсальный способ борьбы с этими ошибками
С другой стороны, с ошибками компилятора тоже нет универсального способа борьбы...
0
 Аватар для lebowski228
0 / 0 / 0
Регистрация: 27.10.2018
Сообщений: 3
05.11.2018, 18:14  [ТС]
Так, ну я исправил ошибочки... Вынес определение Node за пределы класса (или как там у программистов правильно говорить, вне области видимости класса) и все заработало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.11.2018, 18:14
Помогаю со студенческими работами здесь

Ошибка компоновщика
Перенёс проэкт с компа академии на свой комп (заменил код копипастом, системные файлы не трогал). Перед компиляцие выдаёт ошибки, которые...

Ошибка работы компоновщика
Добрый день. Работаю в Windows, в Visual Studio 2013 с установленным Qt и Qt vs-addin. Компоную виджеты на вкладке, три по вертикали и...

Ошибка средств компоновщика
Здравствуйте. Есть такой код: //#include &lt;vcl.h&gt; #include &lt;Windows.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #include...

Ошибка компоновщика LNK2019
Здравствуйте, я постигаю DirectX, и вот с самого начала какие-то проблемы у меня с ним. Текст программы инициализации: #include...

PyQt: манипуляции с виджетами компоновщика
Здравствуйте! На форме имеется GridLayout и несколько однообразных виджетов внутри него. Идея такая: вместо того, чтобы отключать...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru