error: no match for call to '(std::ifstream) (char*&)

sammy2ooo

voll Tohuwabohu
Hallo Leute,

ich häng grad an nem Problem und komm nicht weiter. Wäre nett wenn mir sagen würde was hier falsch läuft. Ich möchte direkt im Konstruktor eine Datei öffnen. Wie macht ihr das?

Grüsse

parser.h:
Code:
#ifndef PARSER_H_
#define PARSER_H_
#include <fstream>

class Parser
{
	private:
		std::ifstream fd;
		char* dirs;
		char* compress;
	
	public:
		Parser(char*);
		~Parser();
		char* getValue(char*);		
};

#endif /*PARSER_H_*/

parser.cpp
Code:
#include <iostream>
#include <fstream>
#include "parser.h"

Parser::Parser(char* p_file)
{
	fd(p_file); 
}

Parser::~Parser()
{
	//fd.close(); 
}

char* Parser::getValue(char* var)
{
	return var;
}
Code:
**** Build of configuration Release for project cpp ****

make -k all 
Building file: ../parser.cpp
Invoking: GCC C++ Compiler
g++ -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"parser.d" -MT"parser.d" -o"parser.o" "../parser.cpp"
../parser.cpp: In constructor 'Parser::Parser(char*)':
../parser.cpp:7: error: no match for call to '(std::ifstream) (char*&)'
make: *** [parser.o] Error 1
make: Target `all' not remade because of errors.
Build complete for project cpp
 
Wenn überhaupt, dann kann das nur so funktionieren:

Code:
Parser::Parser(char* p_file) : fd(p_file) {
}

In diesem Fall wird beim Initialisieren der Variablen fd nicht der Standard-Konstruktor verwendet, sondern einer, der einen char * Parameter erwartet.

Bedenke: In C++ werden Member-Variablen, Attribute oder wie auch immer Du sie nennen magst so wie in meinem Beispiel initialisiert. Im Rumpf des Konstruktors können nur noch Zugriffe und Zuweisungen stattfinden.

Beispiel:

Code:
class Klasse1 {
public:
  int m;

  Klasse(void) { }; // Konstruktor #1
  Klasse(int p) : m(p) { }; // Konstruktor #2
  Klasse(int a, int b) { m = a + b; } // Konstruktor #3
}

classe Klasse2 {
public:
  Klasse1 obj1, obj2, obj3;

  Klasse2(void) : obj1(123), obj3(1, 2) { };
}

int
main(int argc, char **argv) {
  Klasse2 o;
}

Für o.obj1 wurde nun Konstruktor #1 aufgerufen. Dort wurde o.obj1.m mit dem Wert 123 initialisiert.

Für o.obj2 wurde der Konstruktor #2 aufgerufen. Konstruktor #2 lässt den Wert von obj2.m uninitialisiert, daher ist der Wert von o.obj2.m undefiniert.

Für obj3 wurde der dritte Konstruktor aufgerufen. Dieser hat obj3.m den Wert 3 zugewiesen.

Es ist wichtig, den Unterschied zwischen Initialisierung und Zuweisung in diesem Beispiel zu verstehen. Dann verstehst Du auch, weshalb Dein Code nicht funktioniert.
 
danke für deine Antwort. Hab das Progg angepasst. Beim Aufruf von print() passiert allerdings überhaupt nichts. Ich kapier das nicht :confused:

Code:
#include <iostream>
#include <fstream>
#include "parser.h"

Parser::Parser(char* p_file) : fd(p_file, std::ios::in | std::ios::binary)
{
	fd.open(p_file);
}

Parser::~Parser()
{
	fd.close(); 
}

char* Parser::getValue(char* var)
{
	return var;
}

void Parser::print() 
{
	while(fd.getline(temp, 80)) 
	{
		std::cout << temp << std::endl;
	}
}
 
Zurück
Oben