2011-08-15 4 views
9

내가 MSVC10에서 잘 컴파일이지도가 : std :: ofstream은 움직일 수 있습니까?

std::map<std::string, std::ofstream> m_logFiles; 

그러나 우분투에

사용하여 g ++ 4.5 C++ 0X이 활성화를, 나는 다음과 같은 오류 메시지가 :

는/usr/포함/C++/4.5/bits/ios_base.h | 785 | 오류 : 'std :: ios_base :: ios_base (const std :: ios_base &)'가 개인용

개체 대신 포인터를 사용하여 문제를 해결했습니다.
웹에서 검색 할 때 스트림을 복사 할 수 없음을 알았습니다 (이유는 잘 설명되어 있습니다). 하지만 내 질문은, 표준입니다 :: ofstream 이동식 무엇입니까? 그렇다면 표준 컨테이너에서 템플릿 매개 변수로 사용할 수 없습니까?
그렇다면 MSVC10 뒤에 g ++가 있습니까? (MSVC에서 왜 작동하는지 설명 할 것입니다). 필자는 컴파일러 작성자에게 심지어 최종본이 아닌 것을 구현하도록 부탁하는 것은 어리석은 짓을 알지만, 미래에 대해서는 궁금하다.

g ++ 4.6.1을 사용하면 도움이되지 않았습니다.

편집 : 내가 조금 더 파헤친 의견을 읽고 삽입이지도의 선언이 아니라 문제를 일으키는 것으로 나타났습니다.

#include <string> 
#include <fstream> 
#include <map> 

using namespace std; 

int main() 
{ 
    map<string, ofstream> m_logFiles; 
    ofstream st; 
    m_logFiles.insert(make_pair<string, ofstream>(string("a"), move(st))); 
    return 0; 
} 

하지만 여전히 행운 :

읽기 Cubbi의 링크를 나는 다음을 시도했다. g ++는 삭제 된 복사본 생성자의 사용에 대해 불평합니다.

+0

GCC 4.6.1에서 정상적으로 컴파일됩니다. –

+0

게시 된 코드는 GCC 4.5.3에서도 잘 컴파일됩니다. 그러나 GCC의 라이브러리 (clang의 libC++와는 달리)는 아직 map.emplace()를 구현하지 않았습니다. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436 - 아마도 그것이 오류 메시지의 원인입니까? – Cubbi

+0

@Cubbi : 귀하의 링크를 읽고 std :: move를 사용하여 시도했지만 변경은하지 않았습니다. –

답변

8

std::ofstream입니다. 이 프로그램은 나 /의 libC++ 연타를 사용하기위한 컴파일 :

#include <string> 
#include <fstream> 
#include <map> 

int main() 
{ 
    std::map<std::string, std::ofstream> m_logFiles; 
} 

참조 27.9.1.11 [ofstream.cons].

+5

하나의 컴파일러 (또는 많은 컴파일러)에 대한 결과는 실제로이 질문에 대답하지 않습니다. 스펙에 대한 참조가 필요합니다. – Nemo

+5

@Nemo - Howard는이 컴파일러의 표준 라이브러리를 구현하는 사람입니다. 나는 그를 믿을거야. –

+1

C++ 0x 초안의 섹션 27을 모두 확인하십시오. "ofstream은 이동 가능"이라고하는 단일 장소를 찾지 못했지만 스트림 클래스에는 이동 생성자가 있고 지정 연산자와 다른 모든 이동 관련 배관이 있습니다. 그래서 예, 그들은 움직일 수 있다고 하워드는 말했습니다. :) – jalf

5

이전에 비슷한 질문을했고 GCC가 this answer에 설명 된대로 (아직 GCC 4.6.1을 테스트 한) GCC가 움직일 수있는 fstream을 지원하지 않는 것으로 나타났습니다.