1

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

我有一个接口类:

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 结构:

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);


};

它运行良好,但我有点失去了对我的结构类的兴趣。

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

谢谢。

4

3 回答 3

2

您必须添加typename

template <typename T>
class CTestMaybe
{
public:
    CTestMaybe(typename vecValidators<T>::Type* a_Validators);
};
于 2012-10-19T07:58:42.860 回答
1

该类型vecValidators<T>::Type是一个从属名称(如果我得到正确的术语)。这意味着您必须在此处添加额外的内容typename

CTestMaybe(typename vecValidators<T>::Type* a_Validators);
于 2012-10-19T08:01:44.887 回答
1

C++ 编译器在你的函数声明中有一个类型,但是它看到vecValidators<T>::Type*并且因为vecValidatorstemplate不知道它Type是其中的一个类型,所以你必须使用它对编译器说它,typename所以你应该将你的函数更改为:

CTestMaybe(typename vecValidators<T>::Type* a_Validators);
于 2012-10-19T08:01:56.947 回答