2016-06-30 9 views
1

응답하지 않습니다변환 연산자 (할당 연산자 =) 내 구조체에 대한 = 할당 연산자를 호출을 테스트하기 위해 노력했습니다

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

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 
}; 

와 나는이 같은 테스트는-몰았다

나는 오류가 발생 :

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 레이블을하지 마십시오 - 그들은 정말 브라우저에서 실행할 수 없습니다 ... [의 –

+0

가능한 중복 왜의 찬성이 경우에 호출 된 할당 연산자 복사 생성자?] (http://stackoverflow.com/questions/14637805/why-is-the-assignment-operator-not-called-in-this-case-in-favor-of-the-copy-cons) – TobiMcNamobi

답변

4

선언

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

중 & hellip; 복사 할당 연산자를 호출하지 않습니다.

복사 생성자를 사용합니다 (또는 사용하는 것처럼 동작합니다). =은 복사 초기화를 나타냅니다.

클래스에 다른 생성자가있는 경우 vararray 인스턴스로 변환하는 것으로 간주되었으므로이 부분이 최적화되지 않은 경우 복사 생성자에 전달됩니다.

하지만 기본 복사 생성자 만 있습니다. 클래스 통해

  • B.

  • B의 경우를 수용 생성자 : 클래스 타입 A와 타입 B의


    변환이 가장 두 가지 방법 중 하나를 나타낸다 B operator A (변환 연산자)을 통해 클래스입니다. 다른 뉴스에서


:

  • void* 유형의 정보를 삭제하는 방법입니다. 형식 정보를 파기하는 것은 문제를 만드는 방법입니다. 따라서 void*이 가장 좋습니다.
+0

@ 관절과 hth. - 알프. 정보 주셔서 감사합니다. 어쩌면 내가 다시 생각해야한다. –

+0

죄송합니다. 복사본 초기화의 일부를 완료하기 위해 추가하는 것을 잊어 버린 일부 쓰레기 (이 시간에 수집합니다)를 처리해야했습니다. 지금 고치세요. –