[MS VC++] Template Problem

7H3 N4C3R

Lt. Commander
Registriert
Feb. 2002
Beiträge
1.816
Hi!

Ich will folgendes hier unter MS Visual C++ 6 kompilieren:
(damit lässt sich Typ-Gleichheit bereits zur Kompilierzeit bestimmen)
Code:
#include <cstdlib>
#include <iostream>
#include <vector>

template <class T, class U>
class Conversion
{
public:
	enum { sameType = false };
};

template <class T>
class Conversion <T, T>
{
public:
	enum { sameType = true };
};


int main()
{
	using namespace std;
	cout
		<< Conversion<double, int>::sameType << ' '
		<< Conversion<char, char*>::sameType << ' '
		<< Conversion<size_t, vector<int> >::sameType << ' '
		<< Conversion<int, int>::sameType << ' ';

	system ("pause");
	return 0;
}

Compiler schrieb:
Kompilierung läuft...
main.cpp
G:\VC++\templ1\main.cpp(17) : error C2989: 'Conversion<T,T>' : Vorlagenklasse wurde bereits als Nicht-Vorlagenklasse definiert
G:\VC++\templ1\main.cpp(17) : error C2988: Unerkannte Vorlagendeklaration/-definition
Fehler beim Ausführen von cl.exe.

Unter Borland C++ Builder tut es. Ist also einfach der Compiler zu blöd?

Wenn mir das jemand beantworten kann, gebe ich gerne den Grund an, warum ich den C++ Builder auch nicht nehmen kann :rolleyes:
 
ich tippe auf ein ms vc++ eigenes problem. habs mal schnell mit nem g++ gemacht, und das geht.
ist jetzt geraten, aber versuch mal in der primaeren template klasse ne abhaengigkeit von einem der template parameter zu schaffen (zb nen member U u;). vielleicht will er ja sonst die klasse als non-template interpretieren.
 
Das hilft leider auch nicht. Es sieht wohl wirklich so aus, als wenn VC++ das nicht kann... :( Hmm... muss ich wohl mal notgedrungen VC.net probieren :rolleyes:
 
Neues Problem

Hmm... dachte mir, ich probier mal Dev-C++ aus. Naja, und das, was ich gepostet hab, schluckt der Compiler auch. Allerdings nörgelt er bei dem hier (was das Visual C++ aber wiederum ohne Mucken kompiliert):

Code:
#include <cstdlib>
#include <vector>
#include <iostream>

template < class T, class U >
class Conversion
{
  typedef char Small;
  class Big { char dummy[2]; };
  static Small Test(U);
  static Big Test(...);
  static T MakeT();
public:
  enum { exists =
    sizeof(Test(MakeT())) == sizeof(Small) };
};

int main()
{
  using namespace std;
  cout
    << Conversion < double, int >::exists << ' '
    << Conversion < char, char* >::exists << ' '
    << Conversion < size_t, vector<int> >::exists << ' ';
    
  system ("pause");
  return 0;
}




Ich habe noch auf den G++ 3.3.3 geupdatet, hat aber nix gebracht. Bin so langsam am Verzweifeln, ich brauche einen Compiler, der beide Codeschnipsel compilieren kann :(


EDIT:
Argh, zwischen dem Wust an Warnings war nicht zu erkennen, dass das garkein Fehler ist. Der Compiler tut es doch soweit =)
 
Zuletzt bearbeitet:
liest du grad "Andei Alexandrescu: Modern C++ Design" oder wo hast den code her?
wozu brauchst du das?
 
Genau! :D Will einfach mal ein paar neue Techniken ausprobieren. Und die, die dort beschrieben sind, sind wirklich extrem interessant und gut!

Edit:
Mir gefällt vor allem der Ansatz, diverse Fehler endlich in die Compile-Zeit verschieben zu können. Auch die Typ-Listen lesen sich sehr interessant - allerdings bin ich da noch nicht ganz so weit.
 
Zuletzt bearbeitet: (Blöde Rechschreibung =))
Zurück
Oben