【问题标题】:Linker 2001 Error and undefined identifier for member variable链接器 2001 错误和成员变量的未定义标识符
【发布时间】:2013-02-28 20:36:23
【问题描述】:

几乎完成了这个程序,在转移到公共计算机并更改了一些代码后,我注意到我收到了一个链接器错误,我还决定询问另一个错误(以及为什么会发生)。

有问题的功能如下。出于某种原因,最后一行“ValidTlds[transferString]....”表明 VS 不识别 ValidTLD,并且只有在我添加 TldPart::(它所在的文件的名称)后才会这样做。这与其他名称冲突吗?

另外,我认为与函数有关的更重要的错误是未解决的外部符号。确切的行:

Error   3   error LNK2001: unresolved external symbol "public: static class std::map<class String,class String,struct std::less<class String>,class std::allocator<struct std::pair<class String const ,class String> > > TldPart::ValidTlds" (?ValidTlds@TldPart@@2V?$map@VString@@V1@U?$less@VString@@@std@@V?$allocator@U?$pair@$$CBVString@@V1@@std@@@3@@std@@A)    V:\My Documents\Visual Studio 2010\Projects\EmailChecker_HW2\EmailChecker_HW2\TldPart.obj

我尝试阅读您在外部符号上的问答页面,并尝试了一些建议(最初我有两个),并且通过在类之外声明静态函数,我设法将其减少为一个链接器错误。大家看看有什么问题吗?在 main.cpp 中,我将该函数引用为 `TldPart::PreloadTLDs;',但删除该行并没有消除错误(并且我在 main.cpp 文件的顶部有 #include "TldPart.h") .这是函数,我将在下面发布 header 和 cpp 文件以供完整参考。完整的项目相当广泛(我上次检查时接近 1100 行),所以我只包括这些作为初学者。感谢您的帮助,我很感激。

static void PreloadTLDs()

static void PreloadTLDs()
{
    bool initialized = false;
    bool fileStatus = false;
    string tldTest = ""; // used for getline() as allowed.
    char * transferString = " "; // used to transfer chars from string to String

    ifstream infile;

    infile.open("ValidTLDs.txt");

    fileStatus = infile.good();

    if(fileStatus != true)
        cout << "Cannot read ValidTLD's file. Please check your file paths and try again.";
    else
    {
        while(!infile.eof())
        {
            getline (infile, tldTest); // sets the current TLD in the list to a string for comparision

            // converts TLD to lowercase for comparison.
            for(unsigned int x = 0; x<tldTest.length(); x++)
            {
                tldTest[x] = tolower(tldTest[x]);
                transferString[x] = tldTest[x];

                ValidTlds[transferString] = String(transferString);
            }
        }
    }
}

ma​​in.cpp(缩短)

#include <iostream>
#include <fstream>
#include "String.h"
#include <map>
#include <string> // used for the allowed getline command
#include "Email.h"
#include "TldPart.h"

using namespace std;

void main()
{
    string getlinetransfer; // helps transfer email from getline to c string to custom String
    double emailTotal = 0.0; // Used to provide a cool progress counter
    double emailCounter = 0.0; // Keeps track of how many emails have been verified.
    int x = 0; // used to set c-string values, counter for loop
    char * emailAddress = new char[getlinetransfer.size() + 1]; // c string used for getting info from getline.

    cout << "Welcome to email validation program!" << endl;
    cout << "Pre-Loading Valid TLD's..... \n" << endl;

    TldPart::PreloadTLDs;
}

TldPart.h

// TldPart.h - TldPart validation class declaration
// Written by ------

#pragma once

#include "String.h"
#include <map>
#include "SubdomainPart.h"
#include <string>
#include <fstream>
#include <iostream>

using namespace std;



class TldPart
{
public:
    // MUST HAVE a defualt constructor (because TldPart is a member of Domain)
    TldPart() {}

    // Takes the address and stores into the Address data member
    void Set(const String& address);

    static void PreloadTLDs();

    // Returns true when the Address is valid or false otherwise
    bool IsValid();

    static map<String, String> ValidTlds;
private:
    String Address; 
};

TldPart.cpp

// TldPart.cpp - TldPart validation class implementation
// Written by Max I. Fomitchev-Zamilov

#pragma once

#include "TldPart.h"
using namespace std;

void TldPart()
{

}

// Takes the address and stores into the Address data member
void TldPart::Set(const String& address)
{
    Address = address;
}

static void PreloadTLDs()
{
    bool initialized = false;
    bool fileStatus = false;
    string tldTest = ""; // used for getline() as allowed.
    char * transferString = " "; // used to transfer chars from string to String

    ifstream infile;

    infile.open("ValidTLDs.txt");

    fileStatus = infile.good();

    if(fileStatus != true)
        cout << "Cannot read ValidTLD's file. Please check your file paths and try again.";
    else
    {
        while(!infile.eof())
        {
            getline (infile, tldTest); // sets the current TLD in the list to a string for comparision

            // converts TLD to lowercase for comparison.
            for(unsigned int x = 0; x<tldTest.length(); x++)
            {
                tldTest[x] = tolower(tldTest[x]);
                transferString[x] = tldTest[x];

                ValidTlds[transferString] = String(transferString);
            }
        }
    }
}

// Returns true when the Address is valid or false otherwise
bool TldPart::IsValid()
{   
    bool tldFound = false;

    map<String, String>::iterator it;

    String TLDMatch;

    TLDMatch = TldPart::ValidTlds.find(Address)->first;
    it = TldPart::ValidTlds.find(Address);

    if(it == ValidTlds.end())
        tldFound == false;
    else
        tldFound == true;

    return tldFound;
}

【问题讨论】:

    标签: c++ function linker-errors unresolved-external


    【解决方案1】:

    此代码承诺将在某处定义单个静态变量 TldPart::ValidTlds

    class TldPart
    {
        static map<String, String> ValidTlds;
    };
    

    将此添加到TldPart.cpp,你会很好。

    #include "TldPart.h"
    using namespace std;
    
    map<String, String> TldPart::ValidTlds;  // DECLARE YOUR STATIC VARIABLE
    
    void TldPart()
    {
    
    }
    

    【讨论】:

    • 太棒了,这有助于解决地图 STL 的奇怪命名空间问题。对未解决的外部错误有任何想法吗?
    • 我应该把它放在cpp文件的什么地方?一共有三个函数,一个默认构造函数,或者作为一个全局函数。
    • 它仍然给我 2001 链接器错误,其中 1 个外部未解决。也许它与它是静态的事实有关?
    • 我有一个用于 validtlds,就像以前一样,如果我更改 TldPart::PreloadTlds;到 TldPart::PreloadTlds() 它表明存在第二个未解决的外部 2019 错误,看起来像是 main 中引用的预加载函数本身。可以在课后发布确切的错误。
    • @Reciever80 听起来您构建错误。如果 TldPart.cpp 中定义的任何内容都无法使用,则要么未编译,要么未链接。
    猜你喜欢
    • 2014-09-21
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2015-05-12
    • 2012-02-26
    相关资源
    最近更新 更多