我有以下代码和输出。我有两个问题。
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
答案 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*