2016-06-30 4 views
1

Я пытался проверить вызов оператора присваивания = для моей структуры:оператор преобразования (назначение оператора =) не отвечает

struct array{ 

    void* data; 

    template<typename S, typename T> 
    array& operator= (const map<S, T>& that){ cout << "worked..."; return *this;} 

    private: 
    array();   //i don't need this 
}; 

и я испытываю, поехал так:

map<int, string> var; 
array arr = var; 

я получил ошибку:

Error: conversion from 
'std::map<int, string, std::less<int>, std::allocator<std::pair<const int, string> > >' 
to non-scalar type 'array' requested*/ 

Вопрос: , что именно проблема? Как перегрузить такой оператор? Я имею в виду operator=, который должен преобразовать объект другого типа в его собственный тип класса.

+1

Пожалуйста, не наклеивайте блоки кода на C++ как фрагменты кода JavaScript - они действительно не могут быть запущены в браузере ... –

+0

Возможный дубликат [Почему оператор присваивания не вызывается в этом случае в пользу копировать конструктор?] (http://stackoverflow.com/questions/14637805/why-is-the-assignment-operator-not-called-in-this-case-in-favor-of- the-copyccons) – TobiMcNamobi

ответ

4

Декларация

map<int, string> var; 
array arr = var; 

& hellip; не вызывает оператор присваивания копии.

Он использует (или ведет себя так, как если бы он использовал) конструктор копирования: в объявлении = обозначена инициализация копирования.

Если у класса были другие конструкторы, они были бы рассмотрены для преобразования var в экземпляр array, который затем (если бы эта часть не была оптимизирована) передана в конструктор копирования.

Но у вас есть только конструктор копирования по умолчанию.


Преобразование из типа B к типу класса А лучше всего выражается в одном из двух способов:

  • через класс А конструктор, который принимает B.

  • , если B является классом через B operator A (оператор преобразования).


В других новостях:

  • void* способ сбросить информацию о типе. Отбрасывание информации о типе - это способ создания проблем. Таким образом, void* является лучшим аннулированным.
+0

хорошо сочлененный @ Cheers и hth. - Альф. Спасибо за информацию. возможно, я должен переосмыслить. –

+0

Извините, мне пришлось иметь дело с мусором (они собирают его примерно в это время), поэтому я забыл добавить для завершения части инициализации копии. Фиксация этого сейчас. –