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

sth*_*sth 30 c++ syntax templates constructor

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

一个人为的例子:

struct A {
   template<typename T>
   A() {}
};
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*lis 38

不,C++ 03标准说:

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


Jan*_*ann 9

还有另一种解决方案,用于将类型信息传递给模板化构造函数,这些构造函数不能将此类型的值作为参数:

template<class T>
struct id
{};

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

A a=id<int>();
Run Code Online (Sandbox Code Playgroud)

编辑:

请注意:A a(id<int>());由于最令人烦恼的解析,将无法正常工作.它将被解释为函数声明.请参阅此问题以获得进一步说明


小智 7

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

struct A {
    template<typename T>
    static A create() {
        return A();
    }
private:
    A() {}
};
Run Code Online (Sandbox Code Playgroud)

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

auto a1 = A::create<int>();
auto a2 = A::create<long>();
Run Code Online (Sandbox Code Playgroud)