Может ссылочный тип использоваться в качестве ключевого типа в карте STL

У меня есть свой собственный игровой механизм, который имеет систему плагина C++.

у меня есть некоторый код в заголовочных файлах, таким образом, он помещается в единицу компиляции плагина.

Большие функции, которые живут в основном механизме, вызваны через экспортируемую функцию C (плагин называет MyObject_somefunction (MyObject *obj), который в механизме просто называет obj-> somefunction ()). Если вызывание функции C ужасно для Вашего вкуса, затем с некоторым обманом заголовка, когда заголовок включен в плагин, имейте функцию членства #defined для вызывания функции C:

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

Виртуальные функции или должны быть чистыми или жизни кода в заголовочном файле. Если я не наследовался классу и просто просто инстанцирую один, код виртуальной функции может жить в механизме, но тогда класс должен экспортировать некоторые функции C для создания и уничтожения объекта, который называют от плагина.

В основном, приемы, которые я использовал с целью быть для поддержания общей независимости от платформы, просто составляют экспорт C и приемы заголовочного файла.

19
задан dukedave 25 November 2009 в 10:33
поделиться

4 ответа

Согласно стандарту C ++ 23.1.2 / 7 key_type должен быть назначаемым. Тип ссылки - нет.

14
ответ дан 30 November 2019 в 04:48
поделиться

Нет, потому что многие функции в std :: map принимают ссылку на тип ключа, а ссылки на ссылки недопустимы в C ++.

/ AB

4
ответ дан 30 November 2019 в 04:48
поделиться

Рассмотрим оператор [] (const key_type & key) . Если key_type равно Foo & , то что такое const key_type & ? Дело в том, что это не работает. Вы не можете построить std :: map, где тип ключа является ссылочным.

1
ответ дан 30 November 2019 в 04:48
поделиться

Pointer as a key-type for std::map is perfectly legal

#include <iostream>
#include <cstdlib>
#include <map>

using namespace std;


int main()
{
int a = 2;
int b = 3;
int * c =  &a;
int * d =  &b;
map<int *, int> M;

M[c]=356;
M[d]=78;
return 0;
}

Initialised references cant be keys:

#include <iostream>
#include <cstdlib>
#include <map>

using namespace std;


int main()
{
int a = 2;
int b = 3;
int & c =  a;
int & d =  b;
map<int &, int> M;

M[c]=356;
M[d]=78;
return 0;
}
In file included from /usr/include/c++/4.4/map:60,
                 from test.cpp:3:
/usr/include/c++/4.4/bits/stl_tree.h: In instantiation of 'std::_Rb_tree<int&, std::pair<int&, int>, std::_Select1st<std::pair<int&, int> >, std::less<int&>, std::allocator<std::pair<int&, int> > >':
/usr/include/c++/4.4/bits/stl_map.h:128:   instantiated from 'std::map<int&, int, std::less<int&>, std::allocator<std::pair<int&, int> > >'
test.cpp:14:   instantiated from here
/usr/include/c++/4.4/bits/stl_tree.h:1407: error: forming pointer to reference type 'int&

'

1
ответ дан 30 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: