2011-09-23 200 views
1

处理模板函数的简单示例。代码编译并按预期工作。但我的问题是为什么在“Cmp”和“Lit”中都需要“静态”?否则,它不会编译?模板函数采用模板参数

非常感谢!

template<class T> class Cmp{ 
public: 
    static int work(T a, T b) { 
     std::cout << "Cmp\n"; 
     return 0; 
    } 
}; 

template<class T> class Lit{ 
public: 
    static int work(T a, T b){ 
     std::cout << "Lit\n" ; 
     return 0; 
    } 
}; 

template<class T, class C> 
int compare(const T &a, const T &b){ 
    return C::work(a, b); 
} 


void test9(){ 
    compare<double, Cmp<double> >(10.1, 20.2); 
    compare<char, Lit<char> >('a','b'); 
} 
+0

请注意,整个事情可以表达没有任何类,只需要功能和功能模板。 –

回答

1

static这里需要的原因是,在compare模板函数,你有这样一行:

return C::work(a, b); 

语法C::work(a, b)这里的意思是“调用嵌套类C内部功能work。通常情况下,这会尝试在不提供接收器对象的情况下调用成员函数。也就是说,通常您称为函数work的方式将通过编写

C myCObject; 
myCObject.work(a, b); 

在这种情况下,我们不想调用成员函数。相反,我们希望函数work与常规函数类似,因为我们可以在任何时候调用它,而不必相对于其他对象进行操作。因此,我们将这些函数标记为static,以便它们可以像常规函数一样调用。

希望这会有所帮助!

3

C::work(a, b)命名为C的静态成员函数work()