为什么课外的短手记法不起作用?

时间:2017-09-29 14:35:03

标签: c++ templates language-lawyer

不知怎的,我无法理解这个answer

当在类外部定义成员函数时,为什么我们不能使用简单的嵌套名称说明符(例如Foo::Foo(){}而不是更详细 {{1}即使在成员函数定义之前重复模板声明之后也是如此。

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

即使在您链接到的答案中显示的更简单的情况下。