Ich weiß nicht, was daran falsch ist. Ich kann nicht herausfinden, wo der Fehler liegt. Wenn ich die Implementierung auskommentiere, wird der Fehler auch nicht behoben.
Header-Datei
#ifndef MAIN_SAVITCH_SEQUENCE_H
#define MAIN_SAVITCH_SEQUENCE_H
#include <cstdlib> // Provides size_t
namespace main_savitch_3
{
class sequence
{
public:
// TYPEDEFS and MEMBER CONSTANTS
typedef double value_type;
typedef std::size_t size_type;
static const size_type CAPACITY = 30;
// CONSTRUCTOR
sequence( );
// MODIFICATION MEMBER FUNCTIONS
void start( );
void advance( );
void insert(const value_type& entry);
void attach(const value_type& entry);
void remove_current( );
// CONSTANT MEMBER FUNCTIONS
size_type size( ) const;
bool is_item( ) const;
value_type current( ) const;
private:
value_type data[CAPACITY];
size_type used;
size_type current_index;
};
}
#endif
Quelle
#include "sequence1.h"
#include <assert.h>
namespace main_savitch_3
{
// Default constructer - sequence is empty
sequence::sequence()
{
used = current_index = 0;
}
// Start the iteration
void sequence::start()
{
current_index = 0;
}
// Iterate
void sequence::advance()
{
current_index++;
}
// Number of items in the sequence
sequence::size_type sequence::size() const
{
return used;
}
// Checks if there is a current item
bool sequence::is_item() const
{
return current_index <= used && used > 0;
}
// Returns the current value
sequence::value_type sequence::current() const
{
assert(is_item()); // no current item
return data[current_index];
}
// Adds an item BEFORE the current index
void sequence::insert(const value_type& entry)
{
assert(entry != 0); // pointer is invalid
assert(current_index < sequence::CAPACITY); // no room to add an item
// move items up - starting with the last item and working down to the current item
// arrays start at 0, so the -1 adjusts it
for (size_type i = used - 1; i >= current_index; i--)
data[i + 1] = data[i];
data[current_index] = entry;
}
// Adds an item AFTER the current index
void sequence::attach(const value_type& entry)
{
assert(entry != 0); // pointer is invalid
assert(current_index < sequence::CAPACITY); // no room to add an item
// move items up - starting with the last item and working down to the current item
// arrays start at 0, so the -1 adjusts it
for (size_type i = used - 1; i > current_index; i--)
data[i + 1] = data[i];
if (current_index = 0)
data[used] = entry;
else
data[current_index + 1] = entry;
}
// Removes the current item
void sequence::remove_current()
{
for (size_type i = current_index; i < used; i++)
data[i] = data[i + 1];
}
}
Selbst wenn Ihr Projekt eine main()
-Methode hat, wird der Linker manchmal verwirrt. Sie können dieses Problem in Visual Studio 2010 lösen, indem Sie zu gehen
Projekt -> Eigenschaften -> Konfigurationseigenschaften -> Linker -> System
und SubSystem
in Console ändern.
Wir hatten auch dieses Problem. Mein Kollege hat eine Lösung gefunden. Es stellte sich heraus, dass "main" in einem Bibliotheksheader eines Drittanbieters neu definiert wurde:
#define main SDL_main
Die Lösung bestand also darin, Folgendes hinzuzufügen:
#undef main
vor unserer Hauptfunktion.
Das ist eindeutig eine Dummheit!
wenn Sie haben _tmain
Funktion in Ihren Projekten müssen Sie include <tchar.h>.
Sie benötigen eine main()
-Funktion, damit das Programm weiß, wo es anfangen soll.
Für den Fall, dass jemand das Offensichtliche übersehen hat; Beachten Sie dies, wenn Sie eine GUI-Anwendung erstellen und verwenden
"-subsystem: windows"in den link-args lautet der anwendungseintrag WinMain @ 16. Nicht main (). Daher können Sie dieses Snippet verwenden, um main () aufzurufen:
#include <stdlib.h>
#include <windows.h>
#ifdef __GNUC__
#define _stdcall __attribute__((stdcall))
#endif
int _stdcall
WinMain (struct HINSTANCE__ *hInstance,
struct HINSTANCE__ *hPrevInstance,
char *lpszCmdLine,
int nCmdShow)
{
return main (__argc, __argv);
}
Haben Sie die Funktion main()
implementiert?
int main(int argc, char **argv) {
... code ...
return 0;
}
[edit]
Sie haben Ihre main()
in einer anderen Quelldatei, also haben Sie wahrscheinlich vergessen, sie Ihrem Projekt hinzuzufügen.
So fügen Sie eine vorhandene Quelldatei hinzu: Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Quelldateien, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Vorhandenes Element. Wählen Sie nun die Quelldatei mit dem main()
Wenn Sie Visual Studio verwenden. Möglicherweise erhalten Sie diesen Fehler, weil Sie ursprünglich eine neue Header-Datei erstellt haben. H und diese dann in file.cpp umbenannt haben, in der Sie Ihre main () - Funktion platziert haben.
Um das Problem zu beheben, klicken Sie mit der rechten Maustaste auf file.cpp -> klicken Sie auf Eigenschaften und gehen Sie zu
Konfigurationseigenschaften -> Allgemein -> Elementtyp und ändern Sie den Wert in C/C++ - Compiler anstelle von C/C++ - Header.
Ich hatte dieses Problem trotz:
main()
; undMein letztendlicher Fix war der folgende:
main()
befand sich in einem Namespace, wurde also effektiv something::main()
genannt. Durch das Entfernen dieses Namespaces wurde das Problem behoben.Bei der Arbeit an einem DLL -Projekt in Visual Studio 2013 ist der Fehler LNK2019 aufgetreten.
Ich habe dem Projekt eine neue Konfiguration hinzugefügt. Anstatt den "Konfigurationstyp" als "Dynamische Bibliothek" zu verwenden, fügte Visual Studio ihn als "Anwendung" hinzu. Dies führte zu dem Fehler LNK2019.
Der LNK2019-Fehler wurde behoben, indem unter Projekt -> Eigenschaften -> Konfigurationseigenschaften -> Allgemein "Konfigurationstyp" in "Dynamische Bibliothek (.dll)" und "Zielerweiterung" in ".dll" geändert wurde.
Ja, die ursprüngliche Frage handelt von einem Konsolen-/Anwendungsprojekt, bei dem es sich um ein anderes Problem handelt als bei meiner Antwort. Aber ich glaube, diese Antwort könnte jemandem (wie mir) helfen, der über diesen Thread stolpert.
Sie scheinen keine Hauptfunktion zu haben, die der Einstiegspunkt für Ihr Programm sein soll.