2011-02-27 11 views
0

我的代碼是:力圖打造COORD的載體,導致連接錯誤

#pragma once 
#include "stdafx.h" 
#include <vector> 
#include "field.h" 

class output 
{ 
    void putAtLocation(COORD, char chIcon); //currently this outputs to console 

    static std::vector<COORD> m_vsOutputBuffer; 
public: 
    output(void); 

    static void addToken(COORD); 
    void drawTokens(); 

    ~output(void); 
}; 

和鏈接器錯誤是:

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) 

這一定是問題行:

static std::vector<COORD> m_vsOutputBuffer; 

我一直在這呆了幾個小時。 我終於注意到,將 COORD更改爲 int會導致鏈接器錯誤消失。 我讀過它(鏈接器錯誤)通常是由相關性問題引起的。 但這裏只是改變了 TYPE我也讀過它可能是由於它不應該是一種方式使用功能引起的。我認爲它必須是處理COORD的方式;或有關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 2011-02-27 12:12:09

+0

看起來像'COORD',你編譯的預編譯頭文件和你的.cpp編譯的'COORD'在某種程度上是不同的?多年來,我一直與MSVC合作,所以我有點生疏......我試圖暫時禁用預編譯頭文件,看看會發生什麼。此外,AFAIR,這是一個很好的做法,無論如何,包括您的標題,並不指望stdafx讓他們已經 – davka 2011-02-27 12:19:05

+0

WOW,以及我禁用PCH,它建立,啓用它,仍然建立....我真的想知道什麼這可能是。 – Zak 2011-02-27 18:02:01

0

Coord在windows.h頭文件中定義...調查stdafx.h是否有類似 #include <windows.h> 比我試圖複製你的代碼添加此頭和編譯其它..去平滑

要編輯的版本。 你可能忘了改

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 2011-02-27 11:43:35

+0

以及我說這段代碼不會造成問題,我可以鏈接它(只使用windows.h和向量標題..)所以這是你的編譯器缺少一些基本庫的路徑,或者你有什麼錯誤的惠普cpp文件。 。我敢打賭第二個,所以試着把它張貼在那裏.. – Raven 2011-02-27 11:50:30

+0

是的,我開始添加這些冗餘標題作爲鏈接器看到它需要的東西的最後努力。讓我試着去理解其餘的內容。 – Zak 2011-02-27 12:19:26

相關問題