2010-12-13 10 views
5

なぜこれらのコードをコンパイルできないのか分かりません。私はVisual C++ 2010でテストし、gccは-std = C++ 0xでテストしました。誰かが何か提案しますか?感謝! ありがとう!C++ 0x参照コラプスに関する質問

template<typename T> 
class Foo 
{ 
public: 
void test(const T&){cout<<"const";} 
void test(  T&){cout<<"non const";} 
}; 

int main() 
{ 
int a; 
Foo<int&> f; 
} 

コンパイルエラー: '無効はFoo ::テスト(T)':メンバ関数が既に定義または宣言

をしかし、これはコンパイルすることができますなぜですか?

template<typename T> void foo(const T&){cout<<"const"; } 
template<typename T> void foo(T&){cout<<"non const"; } 
int main() 
{ 
    int a; 
    foo<int&>(a); 
} 

i'vは、C++ 0xの記事を読んで言った:T & & == T &ので、constのT & & == constのT &?

答えて

8

これ:参照されるタイプに適用

class Foo<int&> 
{ 
public: 
void test(int&); 
void test(int&); 
}; 

constは何もしません:

Foo<int&> f; 

は、このインスタンスを生じさせます。参照データメンバ上で動作非静的メンバ関数と比較:

struct A { 
    int &ref; 

    // valid: const member function doesn't treat "ref" as "const int&". 
    void operate() const { 
    ref = 0; 
    } 
}; 

あなたはあなたの目標を達成するためにFoo<...>intを渡す必要があります。

13

i'v read c++0x article said: T& & ==T& , so const T& & == const T& ?

実際、それほど意味がありません。私見、それが表にこれを入れた方がよいでしょう:

T  T&  const T  const T& 
--------------------------------------- 
int  int& const int const int& 
int& int& int&   int& 
     (1)  (2)   (1+2) 

1: Reference collapsing in action 
2: const applies to the reference and is therefore ignored 

Tはすでに参照(2行目)である場合const T中のconstは参照にしていない審判に適用されます。しかし、参照は、初期化後に他のオブジェクトを参照することができないという意味で本質的に一定です。したがって、constはここでは無視されます。あなたは "const collapsing"と考えることができます。 ;-)

1

2つ目の質問では、2つのインスタンス化関数は同じパラメータタイプを持ち、どちらもテンプレートです(テンプレートの場合はテンプレート、テンプレート以外の関数の場合はオーバーロードの解像度は後のものを選択します) )、オーバーロードの解像度は、より特殊化されたテンプレートを選択します。一般的にconst T &はT &よりも特殊な型であるため、最初のテンプレート関数が呼び出されます。

関連する問題