【问题标题】:Can the template parameters of a constructor be explicitly specified?可以显式指定构造函数的模板参数吗?
【发布时间】:2011-02-21 03:43:07
【问题描述】:

类的构造函数可以是模板函数。在调用这样的构造函数时,编译器通常会查看提供给构造函数的参数并从中确定使用的模板参数。是否还有一些语法可以显式指定模板参数?

一个人为的例子:

struct A {
   template<typename T>
   A() {}
};

有没有办法实例化这个类?显式指定构造函数的模板参数的语法是什么?

如果编译器似乎没有找到正确的模板化构造函数,我的用例将是一个问题。显式指定模板参数可能会生成更有用的错误消息,甚至可以解决问题。

【问题讨论】:

  • 为构造函数显式指定模板参数仅适用于构造函数的显式特化、实例化、行外定义和友元声明。
  • template &lt;class TArg&gt; struct A { template&lt;typename T = TArg&gt; A() {} }; - 适合我。但是当然现在我们有了模板类。

标签: c++ templates syntax constructor


【解决方案1】:

没有。 C++03 标准说:

[注意:因为显式模板参数列表遵循函数模板名称,并且 因为转换成员函数模板和构造函数成员函数模板是在不使用函数名的情况下调用的,所以无法为这些函数模板提供显式的模板参数列表。] (§14.5.2/5)

【讨论】:

    【解决方案2】:

    还有另一种将类型信息传输到模板构造函数的解决方案,该构造函数不能将此类型的值作为参数:

    template<class T>
    struct id
    {};
    
    struct A {
      template<class T>
      A(id<T>);
    };
    
    A a=id<int>();
    

    编辑:

    请注意:A a(id&lt;int&gt;()); 将不起作用,因为大多数解析都很麻烦。它将被解释为函数声明。更多解释请见this question

    【讨论】:

    • A a{id()); 怎么样? ?
    【解决方案3】:

    作为一种解决方法:您可以定义一个模板化的静态工厂函数,该函数又会使用私有构造函数返回一个实例。

    struct A {
        template<typename T>
        static A create() {
            return A();
        }
    private:
        A() {}
    };
    

    然后你会得到 A 的新实例,如下所示:

    auto a1 = A::create<int>();
    auto a2 = A::create<long>();
    

    【讨论】:

      【解决方案4】:

      不,您不能使用该构造函数实例化该类。但是:

      
      
      struct A
      {
        template < typename T >
        A(T const&);
      };
      
      

      现在你可以了。

      【讨论】:

      • 我不太明白答案...它与问题有什么关系?
      • 它展示了如何做到这一点。碰巧你不能按照问题的方式去做。
      • 太糟糕的 cmets 不能降级。那远非“伟大”。
      • 你也可以这样做,这样 ctor 似乎不需要 args:template &lt;typename T&gt; A(const T* = NULL); 一定要在 * 和 = 之间保留那个空格,否则你会想好几天错误信息意味着...
      • 我不认为投票赞成的人实际尝试过。您不能这样做,因为编译器无法在没有参数的情况下弄清楚 T 的含义。
      猜你喜欢
      • 1970-01-01
      • 2011-10-27
      • 2018-12-08
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多