У меня есть два разных шаблонных класса. Один из них имеет функцию-член, которая возвращает указатель на объект другого класса шаблона.
В настоящее время я не могу скомпилировать приведенный ниже код, и любые предложения действительно приветствуются.
main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <foo.h>
#include <bar.h>
int main(int argc, char **argv){
...
int nParam;
...
CFoo<float> * pFoo = NULL;
pFoo = new CFoo<float>();
CBar<float> * pBar = NULL;
pBar = pFoo->doSomething(nParam); // error: no matching function for call to ‘CFoo<float>::doSomething(int)’
...
delete pFoo;
delete pBar;
return (0);
}
foo.h
#include <bar.h>
template < class FOO_TYPE >
class CFoo{
public:
...
template < class BAR_TYPE >
CBar<BAR_TYPE> * doSomething(int);
...
};
foo.cpp
template < class FOO_TYPE >
template < class BAR_TYPE >
CBar<BAR_TYPE> * CFoo<FOO_TYPE>::doSomething(int nParam){
...
}
#include "foo-impl.inc"
foo-impl.inc
template class CFoo<float>;
template class CFoo<double>;
template CBar<float>* CFoo<float>::doSomething( int );
template CBar<double>* CFoo<float>::doSomething( int );
template CBar<double>* CFoo<double>::doSomething( int );
template CBar<float>* CFoo<double>::doSomething( int );
/*
I also tried the explicit instantiation in the last line, but I get the error below:
template-id ‘doSomething<CBar<float>*>’ for ‘CBar<float>* CFoo<float>::doSomething(int)’ does not match any template declaration
*/
// template CBar<float>* CFoo<float>::doSomething < CBar<float> * > ( int );
Учтите, что мне нужно вызвать метод doSomething
внутри member function
третьего класса.
myclass.cpp
template < class FOO_TYPE, class BAR_TYPE >
void CMyClass<FOO_TYPE, class BAR_TYPE>::doSomeWork(CFoo<FOO_TYPE> * pFoo){
...
int nParam;
...
CBar<BAR_TYPE> * pBar = NULL;
pBar = pFoo->doSomething<BAR_TYPE>(nParam); //error: expected primary-expression before ‘>’ token
delete pBar;
...
}
Обратите внимание, что у меня была похожая проблема, которую я недавно опубликовал на этом форуме , но, пытаясь адаптировать предложение к моему коду, я не смог устранить ошибку. Надеюсь, мой пост действителен.