C ++如何在类型演绎不可能时调用模板化构造函数

时间:2013-06-06 20:44:57

标签: c++ templates

编译此代码没有问题:

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

A a;
a.f<double>(42);

但是,与模板化构造函数类似的代码无法编译:

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

A a<double>(42);

Gcc在最后一行给出以下错误:错误:'&lt;'之前的意外初始化程序令牌

有没有办法让构造函数示例工作?

1 个答案:

答案 0 :(得分:2)

无法为构造函数显式指定模板,因为您无法命名构造函数。

根据您的目的,可以使用此功能:

#include <iostream>
#include <typeinfo>

struct A
{
    template <typename T>
    struct with_type {};

    template<typename T>
    A(int x, with_type<T>)
    {
        std::cout << "x: " << x << '\n'
                  << "T: " << typeid(T).name() << std::endl;
    }
};

int main()
{
    A a(42, A::with_type<double>());
}

利用类型演绎“欺骗”。

这是非常不正统的,所以可能有更好的方法来做你需要的。