Im base.h:Übergeben Sie die Template-Klasse zu einer Funktion
template <typename T, typename T2> class Base
{
public:
virtual int Foo(T param1) = 0;
virtual int Bar(T param1, T2 param2) = 0;
};
Im derived1.h:
template <typename T, typename T2> class Derived1 : public Base<T, T2>
{
public:
virtual int Foo(T param1);
virtual int Bar(T param1, T2 param2);
};
Im derived2.h:
template <typename T, typename T2> class Derived2 : public Base<T, T2>
{
public:
virtual int Foo(T param1);
virtual int Bar(T param1, T2 param2);
};
In myfile.cpp:
extern "C" template<typename T, typename T2> Base<T, T2> *my_func(template<typename T, typename T2> Base<T, T2> *param)
{
if(<cond1>)
param<char, char> = new Derived1<char, char>();
if(<cond2>)
param<SQLWCHAR, SQLWCHAR> = new Derived2<SQLWCHAR, SQLWCHAR>();
return param<T, T1>;
}
Wird dieser Code sowohl in MSVC 2010 als auch in gcc kompiliert?
Ich hatte schon Probleme mit Compiler Schalten, zuerst so fragen wollte es, bevor man ...
auch: Ich die Funktion templatized werden nicht wollen. Ich möchte das Template-Objekt übergeben und von der Funktion zurückgegeben werden.
Vielen Dank.
[EDIT]
ich gerade nach Hause kam und versuchte:
extern "C" __declspec(dllexport) template<typename T, typename T2> Base<T, T2> *my_func(Base<T, T2> *param)
und bekam dies:
warning C4091: '__declspec(dllexport)' : ignored on left of 'int' when no variable is declared
error C2143: syntax error : missing ';' before ''template<''
Wie mache ich es? Die Funktion muss exportiert werden und sollte daher eine C-Verknüpfung haben.
Der andere Weg ist, die Funktion als C++ zu definieren und seinen Symbolnamen aus der dll/so zu holen, was schmerzhaft ist.
[/ EDIT]
[EDIT2}
Was ich im Sinn hatte tatsächlich ist, so etwas zu schreiben:
class CMainFrame
{
private:
template<typename T, typename T2> Base<T, T2> *m_pBase;
public:
CMainFrame();
~CMainFrame();
int CallFunc();
};
CMainFrame::CMainFrame() {}
CMainFrame::~CMainFrame()
{
delete m_pBase;
}
int CMainFrame::CallFunc()
{
template<typename T, typename T2> Base<T, T2> *base = NULL;
m_pBase<T, T2> = my_func(base);
}
[/ EDIT 2]
Sieht aus wie es eklatante Syntaxfehler enthält, so die Antwort von "Nein." –
@UlrichEckhardt, welchen Compiler hast du benutzt? – Igor
Keine, daher sagte ich "sieht aus wie". Funktioniert dieser Code für Sie? Beachten Sie, dass Vorlagen bei der Instanziierung nur vollständig Syntax-geprüft und kompiliert werden! –