函数模板如何使用const限定符推导出类型?

时间:2016-02-20 05:42:38

标签: c++ templates

我有以下代码和输出。我有两个问题。

1)foo1< double,char *>(a,b);无法通过gcc 4.1.2编译。     它无法实例化它。

2)foo1(a,b);输出AB,而foo(a,b)可以输出Ac。是因为const限定符吗?

代码:

#include <iostream>

template<typename A, typename B>
class C {
public:
    void operator()(A a, B b) {
        std::cout << "AB" << std::endl;
    }
};

template<typename A>
class C<A, const char*> {
public:
    void operator()(A a, const char* b);
};

template<typename A>
void C<A, const char*>::operator()(A a, const char* b) {
    std::cout << "Ac" << std::endl;
}

template<typename A, typename B>
void foo(A a, B b) {
    C<A,B>()(a,b);
}

template<typename A, typename B>
class C1 {
public:
    void operator()(A a, const B b) {
        std::cout << "AB" << std::endl;
    }
};

template<typename A>
class C1<A, char*> {
public:
    void operator()(A a, const char* b);
};

template<typename A>
void C1<A, char*>::operator()(A a, const char* b) {
    std::cout << "Ac" << std::endl;
}

template<typename A, typename B>
void foo1(A a, B b) {
    C1<A,B>()(a,b);
}

int main() {
    double a = 0;
    const char *b;
    C<double, const char*>()(a,b);
    foo<double, const char*>(a,b);
    foo(a,b);

    C1<double, char*>()(a,b);
    //foo1<double, char*>(a,b); 
    foo1(a,b);

    return 0;
}

输出:

Ac
Ac
Ac
Ac
AB

1 个答案:

答案 0 :(得分:1)

<DockPanel> <DataGrid x:Name="leftPane" DockPanel.Dock="Left"> <DataGrid.Columns> <DataGridTextColumn Header="Name"/> <DataGridTextColumn Header="Age"/> </DataGrid.Columns> </DataGrid> <DataGrid x:Name="rightPane" DockPanel.Dock="Right"> <DataGrid.Columns> <DataGridTextColumn Header="City"/> <DataGridTextColumn Header="Population"/> </DataGrid.Columns> </DataGrid> </DockPanel> foo1(a, b)b时,const char*的类型推断为const char*const适用于指向的类型,而不是指针本身。它不能删除const,因为它是该类型的重要组成部分。 C1的专业化适用于char*。它们不匹配,因此使用非专用版本。

此外,在您的专业版C1中,您的运营商的签名与非专业版的签名不同。

//In C1<A, B>
void operator()(A a, const B b) //If B was char*, this could be char* const

//In C1<A, char*>
void operator()(A a, const char* b) //This is const char*