2011-12-30 12 views
1

は私のコードです:アングルのないテンプレート関数のインスタンスがクラスのフレンドになれないのはなぜですか?ここ

#include<iostream> 

class foo; 
template<typename T> void bar(T a) { std::cout<< a.var; } 

class foo { 
    int var; 
    public: 
     friend void bar(foo); //here, bar function template is declared in global namescope, 
     // deduction can deduce which template instance we're talking about. 
     //Note: If I place <> just after name bar or qualify bar like ::bar , it all works then. 
}; 

int main() { 
    foo fooo; 
    bar(fooo); 
} 

エラー:/home/O1wLF2/cc1xOI20.o:関数 'メイン' は、:prog.cpp :(テキスト+ 0x46の):「バー(FOO)への未定義参照'

なぜ非修飾テンプレート関数のインスタンスが友人になれないのか知りたいことは何ですか?

答えて

3

テンプレート以外の機能を友人にしています。あなたはテンプレートを友人またはインスタンシエーションの一つにしたいということをコンパイラに伝える必要があります。

+0

MSVSで<>(http://www.ideone.com/cZ6jA)を使用せずに ':: bar'のような' bar'を修飾するだけで、同じプログラムを実行しようとすると、実行されます良い。 –

+1

クラスのフレンド宣言は、bar()という名前の非テンプレート関数を宣言し、fooオブジェクトをパラメータとして宣言します。これは上で宣言された(そして定義された)関数テンプレートには何もありません。まあ、それは引数の型が正確に一致するときに優先される関数テンプレートのオーバーロードです。明示的にbar()を修飾すると、それは宣言ではなく、明らかに関数テンプレートが見つかります。しかし、2つの異なるもの。 –

+1

@ Mr.Anubis:正確にそのコードが証明されているかどうかはわかりませんが、[this](http://ideone.com/C4B9L)はあなたが見ている必要があるコードです。 – ildjarn