【发布时间】:2014-03-19 03:52:34
【问题描述】:
我有一个模板类,我试图在类定义之外定义一个成员函数,如下所示:
class traits {
typedef std::vector<int> container_t;
...other typedefs//
};
template <class traits>
class Foo {
typedef typename traits::container_t container_t
// where container_t = std::vector <int>
// member function to be templatized over container type
void Initialize (container_t&);
private:
container_t temp; //temp is of type std::vector<int>
};
template <typename T>
void Foo <traits>::Initialize (T& data)
{
fill the data
}
我希望函数 Initialize 采用模板容器类型 -- container_t 其中 container_t 可以是 std::vector 或 std::set 等等。
但是我得到编译器错误
" Initialize (T&) 的原型与 Foo 类中的任何一个都不匹配" " 候选人正在初始化 (container_t&) " ...
【问题讨论】:
-
您的意思是让您的
traits类成为模板吗?正如目前所写的那样,这个问题没有任何意义。为什么Foo需要成为类模板? -
@Praetorian:除了
Initialize的定义中的错误之外,它确实(至少一些 有意义)。无论模板参数的拼写方式与后来用作参数的类型完全相同,Foo模板都可以接受任何类型,而不仅仅是traits。 -
@David 同意,但意图似乎只是将
traits作为模板参数,因为 OP 希望它具有container_t嵌套类型。但话又说回来,也许他定义了多个traits类型类。 -
@Praetorian 特征类包含很多类型定义(本质上它是一个具有类型定义和静态成员的类。有许多类,例如 Foo 依赖于特征类。它包含容器的类型定义类型,以便我可以从向量更改为集合等等(当然,某些实现会更改以填充向量或集合(push_back 或 insert),但现在还可以