代码之家  ›  专栏  ›  技术社区  ›  Dennis Zickefoose

显式实例化泛型结构的泛型成员函数

  •  2
  • Dennis Zickefoose  · 技术社区  · 14 年前

    我有一个带有模板参数的结构, Stream . 在这个结构中,有一个函数有自己的模板参数, Type .

    如果我试图强制生成和调用函数的特定实例,它会正常工作, 如果 我所处的环境中,结构的确切类型是已知的。如果不是,我会得到一个编译错误。这感觉就像是我错过了一个 typename ,但没有嵌套类型。我怀疑我遗漏了一些基本的东西,但是我已经盯着这段代码看了这么久了,我看到的都是红头发,坦率地说,编写使用模板的代码从来都不是我的长处。

    下面是我能想到的最简单的例子,它说明了这个问题。

    #include <iostream>
    
    template<typename Stream>
    struct Printer {
      Stream& str;
      Printer(Stream& str_) : str(str_) { }
    
      template<typename Type>
      Stream& Exec(const Type& t) {
        return str << t << std::endl;
      }
    };
    
    template<typename Stream, typename Type>
    void Test1(Stream& str, const Type& t) {
      Printer<Stream> out = Printer<Stream>(str);
      /****** vvv This is the line the compiler doesn't like vvv ******/
      out.Exec<bool>(t); 
      /****** ^^^ That is the line the compiler doesn't like ^^^ ******/
    }
    
    template<typename Type>
    void Test2(const Type& t) {
      Printer<std::ostream> out = Printer<std::ostream>(std::cout);
      out.Exec<bool>(t);
    }
    
    template<typename Stream, typename Type>
    void Test3(Stream& str, const Type& t) {
        Printer<Stream> out = Printer<Stream>(str);
        out.Exec(t);
    }
    
    int main() {
      Test2(5);
      Test3(std::cout, 5);
      return 0;
    }
    

    如文所述,GCC-4.4给出了以下内容:

    test.cpp:在函数“void test1(stream&,const type&)”中:
    test.cpp:22:错误:在“bool”之前需要主表达式
    test.cpp:22:错误:应在“bool”之前输入“;”

    Test2 Test3 这两种方法都能很好地编译,如果我不发表意见的话 Test1 程序执行,我得到我所期望的“15”。所以看起来我想做什么的想法没有什么错,但是我在实现中做了一些拙劣的事情。

    如果有人能对我所忽略的事情有所了解,我将不胜感激。

    1 回复  |  直到 14 年前
        1
  •  3
  •   quamrana Ryuzaki L    14 年前

    您需要告诉编译器依赖名称 Printer<Stream>::Exec 是模板:

    out.template Exec<bool>(t);
    

    它的原理和 typename 在这种情况下,有问题的名称不是类型,而是模板。