【问题标题】:Need help regarding Template class instantiation需要有关模板类实例化的帮助
【发布时间】:2011-08-14 16:42:49
【问题描述】:

让我用一个例子来说明我的问题:

template <typename T> class a{
public:
    T data;
    a():data(T()){}
    a(T temp): data(temp) {}
};

所以如果写main()like

a(30);
a("String");

所以根据模板参数推演规则,应该可以生成第一个临时类为a&lt;int&gt;(30)

但我的错误是:

在 '(' 标记之前缺少模板参数

那么为什么会发生这种情况,这仅适用于函数模板?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    从参数中推导模板参数仅适用于函数,不适用于。在你知道类的类型,即它的所有模板参数之前,你甚至不知道这个类有哪些成员函数!

    所以,如果你想直接构造一个对象,你总是要说模板参数:

    a<int> x(30);
    

    这里有一个小思想实验来扩展上述内容。假设我们有

    template <typename T> class Foo;
    

    我们调用Foo::somefunction(x);,其中x 是某种类型。你想,好吧,我这样声明somefunction()

    template <typename T> class Foo
    {
      static void somefunction(const T & x);
    };
    

    所以很明显Tx 的类型相同。但现在想象一下我有一个专业:

    template <> class Foo<char>
    {
      static void anotherfunction(double x);
    };
    

    Foo&lt;char&gt; 类甚至没有一个函数somefunction(),所以表达式Foo::somefunction(x) 甚至没有达到我可以查找参数的阶段! p>

    解决这个问题的常用方法是创建一个免费的辅助函数来构造您的对象:

    template <typename T> a<T> make_a(const T & x) { return a<T>(x); }
    

    由于这是一个函数模板,它的参数可以推导出来:

    make_a(30);      // type a<int>
    make_a("hello"); // type a<char[6]>
    

    【讨论】:

      【解决方案2】:

      构造函数不是模板,它的类是模板。所以在写a(30)的时候,类模板的模板参数推导是做不到的!

      如果存在构造函数模板,则编译器可以推导出模板化构造函数的模板参数。例如这里:

      template <typename T> class A{
      public:
          template<typename U>
          A(const U &): {}   //note : it's a constructor template
      };
      
      A<char>  obj(30); //U is deduced as int
      

      在上面的例子中,只能推导出U,你仍然需要提供T。因为

      • U 是构造函数模板的模板参数。在这种情况下可以进行模板参数推导。
      • T 是类模板的模板参数。此处无法进行模板参数推导。

      【讨论】:

      • 没错,但它不会让您绕过指定 class 模板参数的需要。
      【解决方案3】:

      您仍然需要将临时声明为,例如a&lt;int&gt;(30)

      【讨论】:

        【解决方案4】:

        不幸的是,您不能从构造函数的参数推断类模板参数。

        【讨论】:

          【解决方案5】:

          模板类型推导仅适用于模板函数。您需要为模板类实例化指定参数。您可以使用函数模板来推导模板参数并返回适当的类型。在 c++0 x 中,您可以使用 auto 来保存实例。无法在我的手机上轻松为您编写示例代码!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-26
            • 1970-01-01
            • 1970-01-01
            • 2015-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多