2011-04-04 108 views
3

新手C++和书籍学习,所以我可以是相当迂腐或在我的推理miopic。模板函数和常量/非常量参考参数

在模板函数的情况下,我已经读过,当Reference传递参数时,只有从Reference /指针到NonConst到Reference /指向Const的转换才会完成。

这意味着我相信

template <typename T> int compare(T&, T&); 

当调用比较(CI1,CI1),与CI1是consntant INT,从常量到NonCost转换是不允许的参考参数应该失败。

但它在我的编译器(Visual C++ 10)中有效。有人能解释我发生了什么问题吗?


template <typename T> int compare(T&, T&); 

template <typename T> int compare(T &v1, T &v2) 
{ 
    // as before 
    cout << "compare(T, T)" << endl; 
    if (v1 < v2) return -1; 
    if (v2 < v1) return 1; 
    return 0; 
} 


const int ci1 = 10; 
const int ci2 = 20; 

int i1 = 10; 
int i2 = 20; 

compare(ci1, ci1);  
compare(i1, i1); 

回答

3

呼叫

compare(ci1, ci1); 

产生T作为const int类型(在您的首选符号)。

有效函数签名是那么

int compare(int const&, int const&) 

您可以使用typeid(x).name()查出来你确实有哪些类型。

注意:使用g ++会产生一些不可用的简写形式,然后您需要使用特殊的g ++特定的运行库lib函数进行解码。

干杯& hth。

+0

或者使用g ++ filt命令行工具解码 – 2011-04-04 14:10:53

1

在比较的情况下(CI1,CI1); T将是const int。这就是为什么它的工作原理

2

T将任何类型的变量是 - 你的情况const int,所以compare最终实例看起来像

// T = const int 
int compare(const int& v1, const int& v2) 

在第一种情况下与compare(ci1,ci2)和像

// T = int 
int compare(int& v1, int& v2) 

compare(i1,i2)

1

这是可以接受的,因为当您将int const替换为T时,可以实例化该函数。

2

在第一种情况下,模板用T = const int实例化,这很好。

如果您尝试compare(i1, ci1),您将收到一个错误,因为它无法找到兼容int &const int &的模板参数。将签名更改为compare(const T &, const T &)将解决该问题。