2012-10-18 42 views
3

可能重复:
Why should the implementation and the declaration of a template class be in the same header file?派生类中定义的头文件和定义模板,以CPP文件

我试图定义一个头文件模板,定义它在一个cpp文件中,模板应该在派生类中定义。所以这是我得到:

头文件:

#ifndef ........ 
#define ..... 
template <class mytypename> 
class abcBaseClass:public abcDerivedClass{ 
public: 
    mytypename getvalue(char*) 
}; 
#endif 


源文件:

mytypename abcDerivedClass<mytypename>::getvalue(char* name){ 

} 

我只是想知道这是做的正确方法它?。

这就是我想实现......我想打这个电话是

double x = a->getvalue<double>(char) 
+0

实现必须以与声明相同的文件结束,除非您显式实例化类型。 'typename'也是一个保留字。 –

+0

正确的方法是将整个模板定义放在标题中。 –

+0

你真的想做什么? 'typename'不是模板参数的有效名称,在那个代码中,'base'继承自'derived',这至少是一个反直觉的名称选择。 –

回答

0

最后一种方法不,这不是正确的方法:

应该这样做方法:

#ifndef ........ 
#define ..... 
template <class T> 
class abcBaseClass:public abcDerivedClass{ 
public: 
    T getvalue(char*) 
}; 

#endif 

和.cpp文件: 模板 牛逼abcBaseClass ::的GetValue(字符* CH){}

你的代码不正确的原因是因为typename是一个C++关键字。而且必须编译

中抛出一个错误你也可以使用:

#ifndef ........ 
#define ..... 
template <typename T> 
class abcBaseClass:public abcDerivedClass{ 
public: 
    T getvalue(char*) 
}; 
#endif 

,并在C++文件:

template<class T> 
T abcBaseClass<T>::getvalue(char * ch){ 
} 
+0

好吧,你不能像C++中的其他东西一样将模板的定义放入.cpp文件中。有一个解决方法,但它仍然不同于你通常分开标题/源文件 –

2

类似的问题已经被问了很多次的SO了。

但无论如何...

首先,你犯了一些语法错误。

而不是

​​

它应该是这样的。

#ifndef ........ 
#define ..... 
template <typename T> 
class abcBaseClass:public abcDerivedClass{ 
public: 
    T getvalue(char*); 
}; 
// Definition follow in this file! 
// For reasons or work-arounds, read below. 
#endif 

另外,模板声明和定义都应该放到同一个文件中。 一个例外是,当您将该模板实例化为模板定义所在的源文件中的某种类型时。

就是这样。

#include "this_template.h" 

template <typename T> 
// all sorts of definitions... 

// Explicit instantiate this template!!!! 
template class abcBaseClass<Your_Type_Goes_Here>; 

注意,这种方法的一个根本缺陷是,你只能使用你在这个源在程序中其他地方文件中明确实例的类型。尝试使用其他类型实例化此模板会导致链接器抱怨无法找到匹配的定义。

如果你坚持模板是通用的,并在其他地方定义模板类。 你可以把定义到另一个头文件,只是把它像this_template_impl.h,包括this_template.hthis_template_impl.h

然后,在你的源文件,而不是#include "this_template.h",你写#include "this_template_impl.h

+0

嘿非常感谢。我正试图在一个文件中完成它,我希望定义是如何完成的......这是否适合你说的垫子? abcDerivedClass :: getvalue(char * name) – vadugs

1

你可以把定义一个.cpp文件,但它更麻烦,而不是模板通常完成的方式。

你需要一些额外的代码在.cpp说服编译器填写必要的模板参数,生成功能的一种方法是只使用某种方式的功能:

mytypename abcDerivedClass<mytypename>::getvalue(char* name){ 

} 

void dummy() 
{ 
    abcDerivedClass<double> temp; 
    temp->getvalue(NULL); 
} 

有没有必要实际上调用虚函数,只需将它放在那里(在模板定义之后)就足够了。

我敢肯定,还有另一种方式来显式实例化模板,但因为我不这样做,我永远不会记住。

+0

这只是'template mytypename abcDerivedClass :: getvalue(char *);'' –

相关问题