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

是否可以显式指定构造函数的模板参数?

  •  27
  • sth  · 技术社区  · 16 年前

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

    人为的例子:

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

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

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

    4 回复  |  直到 7 年前
        1
  •  36
  •   James McNellis    16 年前

    不,C++ 03标准说:

    [注意:因为显式模板参数列表跟随函数模板名称,并且 由于转换成员函数模板和构造函数成员函数模板是在不使用函数名的情况下调用的,因此无法为这些函数模板提供显式的模板参数列表。

        2
  •  8
  •   Community Mohan Dere    9 年前

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

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

    编辑:

    请注意: A a(id<int>()); 不会工作,因为最麻烦的分析。它将被解释为一个函数声明。见 this question 进一步解释。

        3
  •  3
  •   Edward Strange    16 年前

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

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

    现在你可以。

        4
  •  2
  •   Knuckles    7 年前

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

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

    然后,您会得到如下的新实例:

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