C++ 成员函数未在我的模板类中声明错误
C++ Member function not declared error in my template class
我的两个函数 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)
{
//
}
长话短说:
error: need 'typename' before 'Set<T>::Iterator' because 'Set<T>' is a dependent scope
Set<T>::Iterator Set<T>::begin()
^
由于您有一个依赖名称,Set<T>::Iterator
,您需要使用 typename
来限定它,即将begin()/end()
函数中返回Set<T>::Iterator
的两行替换为 typename Set<T>::Iterator
。看
我必须在哪里以及为什么必须放置"模板"和"类型名称"关键字?
以获取详细说明。它基本上与形式的声明有关
T::inner * x
编译无法可靠地识别您是定义指向T::inner
的指针(inner
定义为内部class
或typedef
),还是简单地将T::inner
(inner
定义为静态成员)乘以x
参见
http://pages.cs.wisc.edu/~driscoll/typename.html
对于一个具体的例子。
PS:即使编译器没有看到Type<T> * x
形式的声明,并且在您的情况下它应该能够消除声明的歧义,它仍然"混淆"(为什么?我真的不知道),所以你应该在任何依赖的 typename 前面加上 typename
关键字。引用:如果没有 typename,则有一个 C++ 解析规则,该规则表示,即使会导致语法错误,也应将限定的依赖名称解析为非类型。看
§14.6.2 [从属名称]
来自 C++11/14 草案 https://github.com/cplusplus/draft(可能还有标准的同一部分,尽管我买不起)。
- 在气泡排序程序中未声明错误功能
- 未在此范围内声明错误 'xy'
- 在此范围内未声明错误"Clreol"
- 为什么 C 编译器不在 for 循环体中给出重新声明错误?
- 如何修复范围内的字符串声明错误
- 如何修复C++中的"arrStud未在此范围内声明"错误
- 无法识别的模板声明错误 - 不明白我做错了什么
- C 如何从构造函数中声明(错误C2065未宣布的标识符)
- C 无法解释的类“尚未声明”错误,这是由于名称空间而导致的
- 如何解决声明错误
- 在标题文件中获取声明错误
- 异常声明错误
- "inet_ntoa"未声明错误
- #include <string> 导致很多'<blank>'尚未声明错误
- 类声明错误
- C++成员函数未声明错误时(当它看起来是错误时)
- 代码块 HelloWorld C 示例不起作用:未声明错误"ptrdiff_t"
- 头文件类成员函数声明错误:"incomplete type name in nested name specifier"
- 预期语句和预期声明错误 c++
- 针对 android 编译的问题..."未在此范围内声明"错误