模板成员函数的参数推导不适用于函数内部声明的类

Argument deduction for template member functions does not work for classes declared inside function?

本文关键字:函数 适用于 内部 不适用 声明 成员 参数      更新时间:2023-10-16
struct Test
{
        template <class T>
        void print(T& t)
    {
        t.print();
    }
};
struct A
{
    void print() {printf( "A");}
};
struct B
{
    void print() {printf( "B");}
};
void test_it()
{   
    A a;
    B b;
    Test t;
    t.print(a);
    t.print(b);
}

这汇编得很好。

struct Test
{
        template <class T>
        void print(T& t)
    {
        t.print();
    }
};

void test_it()
{   
    struct A
    {
        void print() {printf( "A");}
    };
    struct B
    {
        void print() {printf( "B");}
    };
    A a;
    B b;
    Test t;
    t.print(a);
    t.print(b);
}

此操作失败,并出现错误:对"测试::打印(Test_it((::A&("的调用没有匹配的函数

有人能解释一下为什么会发生这种事吗?谢谢

在第二个示例中,AB是局部类型,根据§14.3.1/2,它们不能用作C++03中的模板类型参数:

本地类型、没有链接的类型、未命名类型或由这些类型组合而成的类型不得用作模板类型参数的模板参数。