Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 27.10.2018
Сообщений: 3
1

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

03.11.2018, 01:27. Просмотров 356. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2018, 01:27
Ответы с готовыми решениями:

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

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

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

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

2
0 / 0 / 0
Регистрация: 27.10.2018
Сообщений: 3
03.11.2018, 02:36  [ТС] 2
Цитата Сообщение от lebowski228 Посмотреть сообщение
универсальный способ борьбы с этими ошибками
С другой стороны, с ошибками компилятора тоже нет универсального способа борьбы...
0
0 / 0 / 0
Регистрация: 27.10.2018
Сообщений: 3
05.11.2018, 18:14  [ТС] 3
Так, ну я исправил ошибочки... Вынес определение Node за пределы класса (или как там у программистов правильно говорить, вне области видимости класса) и все заработало.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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;...

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

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


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

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

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