2

次の 2 つのエラーが表示され続けますが、その理由がわかりません。

error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup MSVCRTD.lib(crtexe.obj)

error LNK1120: 1 unresolved externals

コンソールとして実行することを確認します [リンカー プロパティでもコンソールと表示されます] VC++ 2012 Ultimate を使用しています。私は、専門用語や高度な概念でめちゃくちゃ技術志向ではないので、Dx に圧倒されないようにしてください。

//Main.cpp
#include <conio.h>
#include "XArray.h"


int Main() {
    XArray<int> Test;
    Test.Add(3);
    getch();
    return 1;
}

に続く。

#ifndef XARRAY_H
#define XARRAY_H

template <class X>
class XIndex {
public:
    X Value;
    XIndex<X> *Next;

    //Construct
    XIndex(X ArrayValue) { Value = ArrayValue; Next = nullptr; }

};

template <class X>
class XArray {
    XIndex<X> *First;
public:
    //Construct/Destruct;
    XArray() { First = nullptr; }
    ~XArray();

    //Operators that Alter the structure;
    void Add(X); //Add X to the end.
    void AddX(X, int); //Create Int amount of X values
    void Insert(int, X); //Insert X at Index int
    bool Remove(int); //Remove Index int. Return true if deleted, false if failed.
    //void Sort(); //Todo -- Sorts by value.
    //Operators that deal with the values.
    X Get(int);
    void Set(int, X);


};

template <class X>
void XArray<X>::AddX(X NewVal, int Quantity) {
    for (int i = 0; i < Quantity; i++)
        Add(NewVal);
}

template <class X>
void XArray<X>::Add(X NewVal) {
    XIndex<X> *CurrentIndex;
    XIndex<X> *NewNode; //Where we store NewVal
    NewNode = new XIndex<X>(NewVal);

    //List doesn't exist.
    if (!First) { 
        First = NewNode;
    } else {
        //Start at beginning.
        CurrentIndex = First;
        while ((*CurrentIndex).Next){ 
            CurrentIndex = (*CurrentIndex).Next;
        }
        (*CurrentIndex).Next = NewNode;
    }

}

template <class X>
void XArray<X>::Insert(int Index, X NewVal) {
    XIndex<X> *CurrentIndex;
    XIndex<X> *PrevIndex;
    XIndex<X> *NewNode; //Where we store NewVal
    iCounter = 0;
    NewNode = new XIndex<X>(NewVal);

    //List doesn't exist.
    if (!First) { 
        First = NewNode;
    } else {
        //Start at beginning.
        CurrentIndex = First;

        while ((*CurrentIndex).Next != nullptr && iCounter < Index){ 
            iCounter += 1
            PrevIndex = CurrentIndex;
            CurrentIndex = (*CurrentIndex).Next;
        }
        if (PreviousNode == nullptr) {
            First = NewNode;
            (*NewNode).Next = CurrentIndex;
        } else {
            (*PrevIndex).Next = NewNode;
            (*NewNode).Next = CurrentIndex;
        }
    }

}

template <class X>
bool XArray<X>::Remove(int Index) {
    XIndex<X> *CurrentIndex;
    XIndex<X> *PrevIndex;
    int iCounter = 0;
    if (First == nullptr) return false; //We never had a list.

    //It's the first one;
    if (Index == 0) {
        CurrentIndex = (*First).Next;
        delete First;
        First = CurrentIndex;
        return true;
    }

    //Starting as normal.
    CurrentIndex = First;

    //Loop until we reach the index.
    while (CurrentIndex != nullptr && iCounter < Index) {
        iCounter += 1
        PrevIndex = CurrentIndex;
        CurrentIndex = (*CurrentIndex).Next;
    }
    if (CurrentIndex != nullptr) {
        (*PrevIndex).Next = (*CurrentIndex).Next;
        delete CurrentIndex;
        return true;
    }
    return false;

}

//Destructor;
template <class X>
XArray<X>::~XArray() {
    XIndex<X> *NextIndex;
    XIndex<X> *CurrentIndex;

    //Start at beginning.
    CurrentIndex = First;

    //So long as we aren't at the end [when Next = nullptr];
    while (CurrentIndex != nullptr) {
        NextIndex = (*CurrentIndex).Next;
        delete CurrentIndex;
        CurrentIndex = NextIndex;
    }
}
#endif
4

3 に答える 3

4

int main()C ++では、メイン関数はまたはとして宣言されint main(int argc, char *argv[])ます(C ++標準の3.6.1項のメイン関数を参照)。

あなたの場合、リンカはの本体を見つけることができないmainので、エラーをスローします。

于 2012-12-16T20:19:55.347 に答える
2

プロジェクト -> プロパティ -> 構成プロパティ -> リンカー -> システム

サブシステムをコンソールに変更します。

于 2013-08-08T13:13:32.083 に答える
1

完全にはわかりませんが、一般的に、これらの種類のエラーは、プロジェクトの作成時に選択したプロジェクトの種類に大きく依存しています。コンソールを選択した場合、通常は以下に従う必要があります

int _tmain(int argc, _TCHAR* argv[])

ただし、Windows タイプのプロジェクトを選択した場合は、次のことができます。

int WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)

しかし、既存のプロジェクトで _tmain を WinMain に、またはその逆に変更する場合は、Arivazhagan が提案している方法を実行することをお勧めします。

フォーマットが必要な場合は、Properties -> Configuration Properties -> Linker -> System to Windows で設定を変更できますWinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)

_tmain(int argc, _TCHAR* argv[])フォーマットが必要な場合はコンソール。

于 2014-07-22T11:36:12.343 に答える