2011-02-27 4 views
0
을 시도

내 코드는연결 원인, COORD의 벡터를 생성하는 오류

static std::vector<COORD> m_vsOutputBuffer; 
:

output.obj : error LNK2001: unresolved external symbol "private: static class std::vector<struct _COORD,class std::allocator<struct _COORD> > output::m_vsOutputBuffer" ([email protected]@@[email protected][email protected]@[email protected][email protected]@@[email protected]@@[email protected]@A) 

이 문제 줄 수 있어야합니다

나는 몇 시간 동안 갇혀 있었다. 마지막으로 COORDint으로 변경하면 링커 오류가 사라집니다. 나는 그것이 (링커 오류)는 일반적으로 종속성 문제로 인해 발생한다는 것을 읽었습니다. 그러나 여기서 그것은 단지 TYPE을 변경합니다. 필자는 그렇게 생각하지 않았던 방식으로 함수를 사용함으로써 발생할 수 있다고 읽었습니다. 나는 그것이 처리되어야하는 방법이라고 생각한다. COORD s; 또는 COORD S에 대한 내용이 앞으로 선언되거나 output.cpp에서 제대로 참조됩니다.

편집 : int로 변경하면 컴파일러 오류가 발생하여 링커에 결코 충돌하지 않습니다. 지금은 다시 아무것도

과 CPP 파일입니다 :

#include "stdafx.h" 
#include "output.h" 
#include <vector> 

static std::vector<int> m_vsOutputBuffer; 

output::output(void) 
{ 
} 
void output::addToken(COORD sCoordinate) //mark a coord in the buffer as needing refreshed 
{ 
    m_vsOutputBuffer.push_back(sCoordinate); 
} 

void output::drawTokens() //release the outputbuffer the the output window 
{ 
    for (unsigned int iii = 0; iii < m_vsOutputBuffer.size(); iii++) 
    { 
     putAtLocation(m_vsOutputBuffer[iii], field::checkHit(m_vsOutputBuffer[iii])); 
    } 
} 

void output::putAtLocation(COORD sCoordinate, char chIcon) //outputs a single character to the console 
{ 
    DWORD dwNumWritten = 0; 
    LPDWORD lpdNumWritten = &dwNumWritten; 

    WriteConsoleOutputCharacter(
    GetStdHandle(STD_OUTPUT_HANDLE), //***repeatedly getting this handle may end up a bottleneck 
    LPCTSTR(&chIcon), 
    1, 
    sCoordinate, 
    lpdNumWritten 
    ); 
} 

output::~output(void) 
{ 
} 

도 내가 이걸 발견 :

http://www.cplusplus.com/forum/general/6111/ 그래서 나는 CPP 파일에 정적 문을 이동 시도하고 컴파일 및 실행. 멤버 변수가 아닙니다. 그래서 어떻게 든 벡터를 선언 할 필요가있다. (선언문이 헤더 파일에 정적 객체도 생성하기 전에)

답변

1

당신은 당신의 .cpp 파일에이 줄을 필요

std::vector<COORD> output::m_vsOutputBuffer; 

이는 멤버 변수의 실제 정의입니다 (static의 부재 및 범위 output:: 참고). 수업 (.h)에있는 것은 신고입니다.

정적 변수 output:m_vsOutputBuffer이 없으면 링커에서 해당 변수를 찾을 수 없다고 불평합니다.

+0

오류 C2371 : 'm_vsOutputBuffer': 재정의; 기본 유형이 다른 경우 을 추가하면 오류가 발생합니다. 나는 더 많은 것을 읽은 후에 단지 벡터를 선언하는 것이 불가능하다고 생각한다. – Zak

+0

은 미리 컴파일 된 헤더가 생성 된 곳과 .cpp가 컴파일되는 'COORD'가 어떻게 든 다른 'COORD'가있는 것 같습니다. MSVC에서 일하면서 몇 년이 지 났으므로 녹슨 느낌이 들었습니다 ... 미리 컴파일 된 헤더를 일시적으로 사용하지 않도록 설정하고 어떤 일이 발생하는지 확인하려고했습니다. 또한, AFAIR, 어쨌든 머리글을 포함하고 stdafx로 계산하지 않는 것이 좋습니다. – davka

+0

와우, 잘 PCH를 사용하지 않도록 설정하고, 빌드하고, 활성화하고, 여전히 빌드합니다 .... 정말 알고 싶습니다. 이것은있을 수 있었다. – Zak

0

coord는 windows.h 헤더에 정의되어있다. 비슷한 것이 있다면 stdafx.h를 보라. #include <windows.h> 내가 당신의 코드를이 헤더를 추가하고 컴파일 복사하려고 그 외에는 ... 편집 된 버전에 부드러운

갔다 :. 당신은 아마

,536,913 다시

static std::vector<int> m_vsOutputBuffer; 

을 변경하는 것을 잊었다

static std::vector<COORD> m_vsOutputBuffer; 

그러나 내가 전에 그렇게 생각한 것입니다 .. 두 번째로 헤더와 cpp 파일에 같은 헤더를 포함 할 필요가 없지만 이것이 원인은 아닙니다 .. 그것은 cpp의 줄입니다

static std::vector<COORD> m_vsOutputBuffer;

변화 그것은 단지에와 파일 :

std::vector<COORD> output::m_vsOutputBuffer; 

당신이 읽을 수있는 이유 텍스트 : http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr038.htm

간단히 말하면 선언을 정의해야한다고 말하면됩니다.

+0

참으로 'stdafx.h'헤더에 포함되어 있습니다. 나는 컴파일러가 그것을 타입 좋은 것으로 인식하고 있음을 의미한다. 또한 나는 지금 막 나의 질문을 편집했다. 문제는 정적 벡터를 만드는 것인데, 내가 전에 한 것처럼, 같은 방법으로 ... 그래서 나는 단서를 가지고 있지 않다. – Zak

+0

나는이 코드 조각이 문제를 일으키지 않는다고 말했기 때문에 (windows.h와 벡터 헤더를 사용하여) 링크 할 수있다. 그래서 당신의 컴파일러가 기본 라이브러리에 대한 몇 가지 경로가 누락되었거나 잘못된 부당한 cpp 파일이있다. 나는 두 번째 베팅을 할 것이므로 거기에 게시 해보십시오. – Raven

+0

예, 필자는 링커가 필요로하는 것을 볼 수있는 마지막 도랑 노력으로 여분의 헤더를 추가하기 시작했습니다. 이 나머지 부분을 이해하도록 노력하겠습니다. – Zak