试图创建COORD向量,导致链接错误

时间:2011-02-27 11:27:20

标签: c++ linker linker-errors

我的代码是:

#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" (?m_vsOutputBuffer@output@@0V?$vector@U_COORD@@V?$allocator@U_COORD@@@std@@@std@@A)

这一定是问题界限:

static std::vector<COORD> m_vsOutputBuffer;

我已经坚持了几个小时。 我终于注意到将COORD更改为int会导致链接器错误消失。我读过它(链接器错误)通常是由依赖性问题引起的。 但是这里它只是改变了一个TYPE我也读过它可能是因为它本身不应该使用一个函数。我认为它必须是处理COORD的方式;或者COORD S的某些内容是向前声明的,或者在output.cpp中正确引用。

编辑: 所有更改为int的都是make编译器错误,导致它永远不会访问链接器。现在我又回来了

和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文件并编译并运行。但不是它不是一个成员变量。所以我需要以某种方式向前声明向量。(在声明之前还在头文件中创建静态对象。

2 个答案:

答案 0 :(得分:1)

您需要.cpp文件中的这一行:

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

(注意缺少static和范围output::

这是成员变量的实际定义。课堂上的内容(.h)只是声明

如果没有这个,静态变量output:m_vsOutputBuffer就不存在了,链接器正确地抱怨它无法找到它。

答案 1 :(得分:0)

Coord在windows.h头文件中定义...如果有类似内容,请查看stdafx.h #include <windows.h>。 除此之外我试图复制你的代码添加这个标题并编译它..顺利

编辑版本: 你可能忘了改变

static std::vector<int> m_vsOutputBuffer;

回到

static std::vector<COORD> m_vsOutputBuffer;

但是我假设你之前已经这样了。第二件事是你不必在header和cpp文件中包含相同的头文件,但这不会导致它..它是cpp文件中的行与< / p>

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

简单地说你需要定义不只是声明。