代码之家  ›  专栏  ›  技术社区  ›  Frank

typedef返回值的模板成员函数

  •  9
  • Frank  · 技术社区  · 15 年前

    为什么下面的代码会给我一个错误(G++4.1.2)?

    template<class A>
    class Foo {
    public:
      typedef std::vector<A> AVec;
      AVec* foo();
    };
    
    template<class A>
    Foo<A>::AVec* Foo<A>::foo() { // error on this line
      return NULL;
    }
    

    错误是:

    error: expected constructor, destructor, or type conversion before '*' token
    

    我该如何定义 Foo<A>::foo() 其他函数(返回类型正确)?

    3 回复  |  直到 12 年前
        1
  •  18
  •   ASk    15 年前

    这是一个叫做“的问题。 two-stage lookup “。基本上,因为 A 是中的模板参数 foo() 的定义,编译器无法知道何时首次分析模板,是否 Foo<A>::AVec 是一个类型或甚至存在(例如,由于 Foo<Bar> 它根本不包含typedef)。它只知道模板期间是什么 实例化 这是后来发生的-现在太晚了。

    正确的方法是使用 typename 关键字指示这是一个类型:

    template<class A>
    class Foo {
    public:
      typedef std::vector<A> AVec;
      AVec* foo();
    };
    
    template<class A>
    typename Foo<A>::AVec* Foo<A>::foo() {
      return NULL;
    }
    
        2
  •  13
  •   Johannes Schaub - litb    12 年前

    平常的 typename 问题:

    template<class A>
    typename Foo<A>::AVec* Foo<A>::foo() { // error on this line
      return NULL;
    }
    

    记住:作为一般规则,依赖模板参数的所有限定名都需要 类别名 在他们面前。

        3
  •  -1
  •   Javier    15 年前

    我真的不知道,但是试着把typedef放到班外。