3

可能重复:
为什么模板类的实现和声明应该在同一个头文件中?

我正在尝试在头文件中定义模板,并在 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)
4

3 回答 3

3

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

但无论如何...

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

代替

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

它应该是这样的。

#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

于 2012-10-18T18:10:31.603 回答
1

您可以将定义放在 .cpp 文件中,但这更麻烦,而且不是模板通常的完成方式。

您需要 .cpp 中的一些额外代码来说服编译器生成填充了必要模板参数的函数。一种方法是以某种方式使用该函数:

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

}

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

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

我确信还有另一种显式实例化模板的方法,但由于我不这样做,所以我永远记不得了。

于 2012-10-18T18:22:05.910 回答
0

不,这不是正确的方法:

应该这样做:

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

#endif

并在 .cpp 文件中: template T abcBaseClass::getvalue(char * 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){
}
于 2012-10-18T18:05:16.313 回答