Autor Wątek: Error: Attempting to reference a deleted function  (Przeczytany 1626 razy)

Offline Kyroaku

  • Użytkownik

# Marzec 25, 2018, 21:52:20
Cześć wszystkim ;)

Mam problem o tyle trudny dla mnie do wykrycia, że nie pojawił się on po dodaniu fragmentu kodu, a po przesiadce z VS2013 na VS2015. Dostaję takie oto errory:

Error C2280 'std::pair<const _Kty,_Ty>::pair(const std::pair<const _Kty,_Ty> &)': attempting to reference a deleted function

W output'cie, oprócz wielu odniesień do plików z STL'a, jedno dotyczy mojego pliku:
1>  [...]: note: see reference to class template instantiation 'std::map<int,AnimationKey,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' being compiled
1>          with
1>          [
1>              _Kty=int,
1>              _Ty=AnimationKey
1>          ]

I wskazuje linię:
std::map<int, AnimationKey>animations;

Klasa AnimationKey:
class AnimationKey
{
public:
unsigned int startFrame, endFrame;

AnimationKey();
AnimationKey(unsigned int start, unsigned int end);
void set(unsigned int start, unsigned int end);
};

W nowszym standardzie C++, kiedy pojawiały się operatory przeniesienia wprowadzono, że zadeklarowanie jakiegokolwiek konstruktora, lub operatora przypisania automatycznie ustawia pozostałe konstruktory i operatory przypisania na "delete". Myślałem, że chodzi o to, próbowałem desperacko zadeklarować każdy z konstruktorów, ale nic to nie pomogło :P Nie potrafię nawet tego błędu wywołać tak "na sucho" w nowym projekcie. Możliwe, że to przez update plików z VS2013 do VS2015?

Od dłuższego czasu nie kodziłem w C++ i mam spore braki, jeśli chodzi o nowsze standardy. Będę wdzięczny za każdą wskazówkę.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline albireo

  • Użytkownik

# Marzec 25, 2018, 23:13:29
A próbowałeś zadeklarować operator przypisania?

Offline Kyroaku

  • Użytkownik

# Marzec 25, 2018, 23:59:06
Probowałem. Przypisania przenoszenia też :/

Offline st3tc

  • Użytkownik

# Marzec 26, 2018, 10:58:04
Może błąd masz gdzieś indziej. Zagubiony średnik albo coś ;) Spróbuj sobie wyciągnąć minimalistyczny przykład i na nim sprawdź. Np. taki krótki na bazie tego co podałeś kompiluje się spoko na różnych kompilatorkach:

https://godbolt.org/g/UdWfBy

Offline .c41x

  • Użytkownik
    • homepage

# Marzec 27, 2018, 00:21:21
W output'cie, oprócz wielu odniesień do plików z STL'a, jedno dotyczy mojego pliku:
Te odniesienia do plików STL raczej są istotne, bo z tego co widać nie można nic wywnioskować.

Offline laggyluk

  • Użytkownik
    • http://laggyluk.com

# Marzec 27, 2018, 09:45:08
swoją drogą to nie powinno być tam pointera zamiast klasy?
std::map<int, AnimationKey*>animations;

Offline st3tc

  • Użytkownik

# Marzec 27, 2018, 10:25:06
swoją drogą to nie powinno być tam pointera zamiast klasy?
std::map<int, AnimationKey*>animations;

Nie opłaca się do tak trywialnej z dwoma intami.

Offline Kyroaku

  • Użytkownik

# Marzec 28, 2018, 00:02:28
Ok, generalnie taki błąd wywala przy zapisie:
map1 = map2;
Gdzie map1 i map2 to są mapy z elementami o typie, w którym faktycznie nie ma konstruktora kopiującego (np jest usunięty przez "=delete"). Piszę to, ponieważ w przypadkach kiedy jawnie napiszemy:
map1[0] = new MapElement(map2[0]);
To kompilator zaprowadzi nas bezpośrednio do miejsca błędu, a w moim przypadku dostajemy linię z deklaracją mapy.

U mnie jednak problem polegał na tym, że w ścieżkach miałem ustawiony folder "include" Visual Studio 2013, a używałem Visual Studio 2015. Nie wnikam, co tam się dokładnie stało, bo wcale mnie nie dziwi, że przy takim bajzlu coś nie działa.

swoją drogą to nie powinno być tam pointera zamiast klasy?
std::map<int, AnimationKey*>animations;

Dlaczego "powinno"? Powiedziałbym, że nawet gdyby klasa była bardziej rozbudowana, to to zależy od przeznaczenia tej mapy. Jeśli jestem świadom tego, że użycie mapy może się wiązać ze znaczącym czasem przemielenia tego, to chyba nie ma problemu? Czy może chodzi o coś innego?