Enumerator
Mitglied Kamel
Hi!
Mal wieder eine Grundsatzfrage: wenn ich (in einer Header-Datei die zu einer Programmbibliothek gehört) Template-Klassen definiere, diese noch in der selben Header-Datei mittels typedef o.Ä. an bestimmte Typen binde -- ist dann der Anwender der Bibliothek in der Lage, auf die Symbole zuzugreifen oder erstellt er fleißig seine eigenen?
Beispiel, test.hpp:
Beispiel, test.cpp:
Das ganze kompiliert und gelinkt; sagen wir in "libmytest" (so, dll, wasweisich)...
Wen jetzt ein anderer daherkommt, test.hpp includiert und mit -lmytest verlinkt:
was passiert?
Ich wüsste nicht nur gern, was passiert, sondern vor allem warum... :-(
Und gibt es Unterschiede - je nachdem welchen Compiler, Linker oder welches OS man benutzt?
Gruß
Enum
Mal wieder eine Grundsatzfrage: wenn ich (in einer Header-Datei die zu einer Programmbibliothek gehört) Template-Klassen definiere, diese noch in der selben Header-Datei mittels typedef o.Ä. an bestimmte Typen binde -- ist dann der Anwender der Bibliothek in der Lage, auf die Symbole zuzugreifen oder erstellt er fleißig seine eigenen?
Beispiel, test.hpp:
Code:
// ...
namespace My
{
template<typename TYPE>
class Test
{
public:
// ...
virtual operator TYPE(void) const throw();
virtual const char *getSomething(void) const throw();
// ...
protected:
TYPE value;
};
typedef Test<char> Char;
class NegativeInt
: public Test<int>
{
public:
virtual operator int(void) const throw();
};
}
// ...
template<typename TYPE>
My::Test<TYPE>::operator Type(void) const throw()
{
return value;
}
template<typename TYPE> const char*
My::Test<TYPE>::getSomething(void) const throw()
{
return "Something...";
}
template<> const char*
My::Test<char>::getSomething(void) const throw()
{
return "Something else...";
}
// ...
Code:
// ...
template<> const char*
My::Test<int>::getSomething(void) const throw()
{
return "Something else...";
}
My::NegativeInt::operator int(void) const throw()
{
return 0 - value;
}
// ...
Wen jetzt ein anderer daherkommt, test.hpp includiert und mit -lmytest verlinkt:
was passiert?
Code:
#include <iostream>
#include "my/test.hpp"
int
main(void)
{
My::NegativeInt n(5);
My::Test<void*> p(NULL);
My::Char c('A');
std::cout << c.getSomething() << std::endl; // "Something else..."
std::cout << p.getSomething() << std::endl; // "Something..."
std::cout << n.getSomething() << std::endl; // "Something else..." oder "Something..."?
return 0;
}
Und gibt es Unterschiede - je nachdem welchen Compiler, Linker oder welches OS man benutzt?
Gruß
Enum