C ++ Member函数未在模板类中声明错误

时间:2014-11-27 00:17:31

标签: c++ class templates

我的函数Begin()和End()都有错误:Set<T>中没有声明成员函数 我还尝试了Iterator Set<T>::begin()只有同样的错误...

#include <iostream>
#include <vector>

using namespace std;

template<typename T>
class Set
{
public:
    class Iterator;
    void add(T v);
    Iterator begin();
    Iterator end();

private:
    vector<T> data;
};

template<typename T>
class Set<T>::Iterator
{
public:
    Iterator(int index, Set *s);
    T get();
    void next();
    bool equals(Iterator s);

private:
    int index;
    Set *values;
};

template<typename T>
Set<T>::Iterator::Iterator(int i, Set *s)
{
    index = i;
    values = s;
}

template<typename T>
T Set<T>::Iterator::get()
{
    return (*values).data[index];
}

template<typename T>
void Set<T>::Iterator::next()
{
    index++;
}

template<typename T>
bool Set<T>::Iterator::equals(Iterator s)
{
    return (values == s.values) && (index == s.index);
}

template<typename T>
Set<T>::Iterator Set<T>::begin()
{
    return Iterator(0, this);
}

template<typename T>
Set<T>::Iterator Set<T>::end()
{
    return Iterator(data.size(), this);
}

template<typename T>
void Set<T>::add(T v)
{
    //
}

1 个答案:

答案 0 :(得分:3)

长话短说:

error: need 'typename' before 'Set<T>::Iterator' because 'Set<T>' is a dependent scope Set<T>::Iterator Set<T>::begin() ^

由于您有一个从属名称Set<T>::Iterator,因此您需要使用typename对其进行限定,即替换您在Set<T>::Iterator函数中返回begin()/end()的两行typename Set<T>::Iterator。见

Where and why do I have to put the "template" and "typename" keywords?

详细说明。它基本上与表格

的声明有关

T::inner * x

如果您要定义指向T::innerinner被定义为内部classtypedef)或简单地乘以{{}的指针,则编译无法可靠地识别1 {} {T::inner被定义为静态成员)inner

另见

http://pages.cs.wisc.edu/~driscoll/typename.html

以获取具体示例。

PS:即使编译器没有看到x形式的声明,并且在你的情况下它应该能够消除声明的歧义,它仍然“混乱”(为什么?我不是真的知道),所以你应该在Type<T> * x关键字之前的任何依赖类型名称之前。引用:没有typename,有一个C ++解析规则,即合格的从属名称应该被解析为非类型,即使它会导致语法错误。参见

  

§14.6.2[依赖名称]

来自C ++ 11/14草案https://github.com/cplusplus/draft(可能也是标准中的相同部分,尽管我买不起)。