2012-01-12 27 views
0

如果我在結構(函數)內的某種類型,結構的局部範圍是typedef瞭解兩個結構(函數)中的typedef的作用域

考慮下面的例子,其中我已經在兩個單獨的函數中將foo假設爲intdouble。這個例子是否正確?

template <typename T> 
struct firstfunctor 
{ 
    typedef int foo; 

    foo operator()(const foo& a, const foo& b) 
    { 
    return /*whatever*/ 
    } 
}; 

template <typename T> 
struct secondfunctor 
{ 
    typedef double foo; 

    foo operator()(const foo& a, const foo& b) 
    { 
    return /*whatever*/ 
    } 
}; 

回答

5

是,類型定義的作用域,和你定義成員類型firstfunctor::foosecondfunctor::foo,分別。

+0

+1,但它不是一個*成員類型別名*? – Pubby 2012-01-12 18:55:20

+0

@Pubby:也許吧。也許成員類型*名稱*是一個很好的術語...並且還提醒您需要說'typename firstfunctor :: foo'很多:-) – 2012-01-12 18:56:37

0

是的。

這也適用於函數和命名空間。


該類型將被firstfunctor<>::foo限定。儘管C++ 11的auto允許你解決這個問題,但你可以將它設爲私有。

1

是的,typedefs是有作用域的。您在使用它們時必須指定範圍。

這適用於對象,類和庫。範圍通常限於在一組{ }中定義的內容。

0

是,你可以使用這些類型定義有趣的元編程的概念,讓你在一個類傳遞到模板(或在這種情況下,即使一個模板),並可以使用

typename X<T>::foo

得到你的「動態」類型。

其中X是您的模板化模板參數。