不知怎的,我无法理解这个answer。
当在类外部定义成员函数时,为什么我们不能使用简单的嵌套名称说明符(例如Foo::Foo(){}
而不是更详细 {{1}即使在成员函数定义之前重复模板声明之后也是如此。
答案 0 :(得分:1)
微妙的是
template<class T>
int VisitedSet::getSize() {
return vec.size();
}
C ++编译器还不知道T
适用于什么。当您在VisitedSet的类定义中工作时,您可以明确地使用VisitedSet::...
,但在外部不起作用。
当您在类定义之外时,语法要求您使用tempate<class T>
语法告诉编译器模板参数是什么,然后告诉编译器它们应用的位置。
在这种情况下,这看起来可能不明确,但请考虑以下嵌套案例:
template<class T>
class Foo {
template<class R>
class Bar {
int getSize();
};
};
然后,为什么你需要具体来说更明显:
template<class X, class Y>
int Foo<Y>::Bar<X>::getSize() { ...
和
template<class A, class B>
int Foo<A>::Bar<B>::getSize() { ...
都有效。
这就是你需要的原因
template<class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
即使在您链接到的答案中显示的更简单的情况下。