2012-12-09 2 views
0

오늘 하루 종일 코드에 놀랐습니다. 트랙과 앨범 모음을 다루는 수업이 많이 있습니다. 내 코드가 컴파일되고 파일을 성공적으로 읽지 만 내 앨범 컬렉션 클래스에서 istream & 연산자를 사용하자 마자 런타임에 오류가 발생합니다.C++ 콜렉션 객체 및 iStream 파일 입력

error LNK2001: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class AlbumCollection &)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]@@@Z)1>C:\Users\Shardy\Desktop\AlbumDatabase\Debug\AlbumDatabase.exe : fatal error LNK1120: 1 unresolved externals 

내가 도움이 정말 감사하겠습니다 :

는 오류입니다. 그것은 실망하게된다. 내 책이나 구글도 빛을 발산하지 않습니다. 시간 내 줘서 고마워.

+2

아무 것도 남기지 않는 방법은 관련이 없다고 생각한 다음 다시 컴파일하고 실행하는 것입니다. 문제가 계속 발생하면 반복하십시오. 그런 다음 한 단계를 백업하십시오. 그렇게하면 종종 오류를 발견하게됩니다. –

+0

* 정확한 * 런타임 오류를 게시하십시오. 이렇게하면 사람들이 문제의 위치를 ​​파악하는 데 도움이됩니다. 또한 ** 디버거 **라는 새로운 장비를 사용해 보았습니다. 매우 도움이됩니다. –

+0

문제를 표시하기 위해 문제를 표시하지 않으려 고 시도하지 않았습니까? 두 가지 모두 합리적인 도움을 얻는 데 관련된 단계입니다. 문제가 무엇인지 모른 채 발견 한 것 : 1. std :: istringstream (std :: istringstream)을 사용할 때'std :: stringstream' 사용하기 (여분의'i'는 사용하기에 적합한 클래스 임), 2. std : : endl' 플러시가 의도되거나 요구되지 않는 곳, 3.'using' 지시어의 사용 4. 어색해 보이고'main()'이 되려고하는 것. –

답변

0

일부 문제 :

  1. 을 main.c : 파일이 성공적으로 열릴 경우 파일 가 성공적으로로드 된 것을 주장. 이미로드 된 경우 첫 번째 장소에서 파일을 여는 것이 왜 불편합니까? 흠, 어떻게 그럴 수 있니?
  2. main.c : 파일에서 읽는 메소드를 절대 호출하지 않습니다.
  3. main.c를 : 당신은 대신 if (file.is_open())
  4. 을 main.c의 if (file)을 사용할 수 있습니다 : 당신은 if 문 닫는 }을 놓치고있어.
  5. main.c : argc 또는 argv을 사용하지 않으므로 mainmain(void)으로 선언 할 수 있습니다.
  6. 메서드 정의뿐만 아니라 클래스 선언 (헤더 파일)을 게시해야합니다.
  7. duration.cpp : 숫자 또는 공백이 아닌 ":"과 같은 것을 발견하면 입력 방법이 위변조합니다.
  8. duration.cpp : 더하기 연산자가 시간 계산을 올바르게 수행하지 않습니다. 특히 오버플로가 발생합니다. "00:02:30"으로 "00:59:35"을 추가하십시오.
  9. duration.cpp : operator==은 쉼표 ','연산자를 사용하고 있기 때문에 마지막 표현식의 결과를 반환합니다. 은 아마도 && 또는 논리 AND 연산자를 사용하려고합니다.
  10. duration.cpp : 규칙 3 : 생성자를 정의하는 경우 생성자 또는 파기를 복사하면 모두 3을 지정하고 할당 연산자를 선언해야합니다.
  11. duration.cpp : 수학의 규칙 : 당신이 operator+ 또는 operator-를 정의하는 경우 당신은 또한 운영자 += 잘 로 -=를 구현해야합니다. Boost 수학 라이브러리를 참조하십시오.
  12. duration.cpp : 주문 규칙 : 을 주문하거나 비교하려는 경우 <, <=, ==, !=, >,>= 연산자를 구현해야합니다. 힌트 : 시간을 초로 변환하면 평생을 더 편리하게 만들어야합니다. 을 비교해보십시오. boost :: less_than_comparable을 참조하십시오.
  13. track.cpp : 입력 방법은 먼저 트랙 이름을 읽은 다음 길이를 읽습니다. 데이터 파일에는 지속 시간이 먼저 표시되고 트랙 이름이 표시됩니다. 기간과 열 사이의 필드 구분 기호를 처리 할 코드도 없습니다.

0

Yep, a debugger would be helpful as well as pencil and paper to go through this code.

은 하찮게, 주에 당신은 표시 타의 추종을 불허하는 중괄호가 있습니다. 귀하의 다른 성명서는 닫는 중괄호 (예 : } else {...})

더 중요하게, 나는 (컴파일과 관련하여) 귀하의 메인에 나열된 특정 문제를 해결하기 위해 노력할 것입니다. 첫째로, 나는 나의 가정을 열거한다. 기능 구현을 위해 범위 지정 (::)을 사용하기 때문에 구현 및 인터페이스가 적절하게 구분됩니다 (즉, 클래스가 헤더 파일에 선언되고 구현이 소스 파일에 선언되어 있음).

또한 귀하의 operator<< 구현이 귀하의 AlbumCollections 구현과 동일한 파일에 있다고 가정합니다. 이것은 괜찮지 만, 주 파일은 이것을 모릅니다. 현재 소스 파일 용으로 만 컴파일 중입니다. 더 많은 정보가 없으면 이것이 당신의 문제의 열쇠라고 생각합니다. 다른 파일에서도 작동하도록이 연산자를 선언해야합니다. 다음과 같이 앨범 컬렉션에 대한 헤더 파일에서

, 당신의 AlbumCollection 선언 후 전방 선언을 포함 (난 당신이 헤더에 using 지시어를 사용하지 않는 가정이 있다면, 당신은 아마 없을 것이다.) :

std::istream& operator>>(std::istream& is, AlbumCollection& albums); 

머리글에 #include <iostream>이 제대로 컴파일되어 있어야 할 수 있습니다. 그러나 AlbumCollection.h (또는 해당 헤더가 호출되는 곳)을 포함하는 곳이면이 오버로드를 사용할 수 있습니다. 프로그램을 연결하면 앞에서 정의한 정의가 사용됩니다. 또한이 작업을 수행하려면 정의에서 inline 한정자를 제거해야 할 수 있습니다.

이 문제가 발생한 경우 오류 출력은 아마도 끔찍한보고 였을 것입니다. 이 문제가 발생하면 많은 컴파일러 오류 출력이 사라지고 기존 코드 컴파일 문제를 디버깅하는 것이 훨씬 간단 해집니다.