在另一个模板类构造函数中使用typedef模板时出错

时间:2012-10-19 07:55:42

标签: c++ templates

我的模板有点问题。由于使用代码更容易解​​释,这是我的问题。

我有一个接口类:

template <typename T>
class IElemValidator
{
public:
    virtual bool validate(T val) const = 0 ;
    virtual ~IElemValidator(){};
};

和typedef结构:

template <typename T>
struct vecValidators
{
    typedef boost::ptr_vector<IElemValidator<T>> Type;
};

我可以在任何地方使用我的typedef结构,除了像这样的另一个模板classe的参数:

template <typename T>
class CTestMaybe
{
public:
    CTestMaybe(vecValidators<T>::Type* a_Validators);
};

尝试编译时,我有这个错误:

Error   2   error C2061: syntax error : identifier 'Type'

当然,我可以这样做:

template <typename T>
class CTestMaybe
{
private:
    typedef boost::ptr_vector<IElemValidator<T>> vecValidator;

public:
    CTestMaybe(vecValidator* a_Validators);


};

并且它运行良好,但我有点失去了我的struct类的兴趣。

那么,我做错了什么?是否有“正确”的方式来做我想要的事情?

感谢。

3 个答案:

答案 0 :(得分:2)

您必须添加typename

template <typename T>
class CTestMaybe
{
public:
    CTestMaybe(typename vecValidators<T>::Type* a_Validators);
};

答案 1 :(得分:1)

类型vecValidators<T>::Type依赖名称(如果我获得了正确的术语)。这意味着你必须在那里增加typename

CTestMaybe(typename vecValidators<T>::Type* a_Validators);

答案 2 :(得分:1)

C ++在函数声明中编译了一个类型,但它看到vecValidators<T>::Type*,而vecValidatorstemplate,它不知道Type是一个类型它,所以你必须使用typename向编译器说出来,所以你应该将你的函数改为:

CTestMaybe(typename vecValidators<T>::Type* a_Validators);