【问题标题】:Why doesn't the short-hand notation work outside class?为什么速记符号在课堂外不起作用?
【发布时间】:2017-09-29 14:35:02
【问题描述】:

不知何故我无法理解这个answer

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

【问题讨论】:

  • templated class 用词不当。它是一个类模板,也就是说它是一个用于创建一个类的模板,它不是一个类本身。

标签: c++ templates language-lawyer


【解决方案1】:

微妙之处在于

template<class T>
int VisitedSet::getSize() {
   return vec.size();
}

C++ 编译器还不知道T 适用于什么。当您在 VisitedSet 的类定义内部工作时,您可以明确地使用 VisitedSet::...,但在外部不起作用。

当您在类定义之外时,语法要求您使用tempate&lt;class T&gt; 语法告诉编译器模板参数是什么,然后告诉编译器它们适用于何处。

在这种情况下,这可能看起来模棱两可,但请考虑以下嵌套情况:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2016-03-23
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多