これは非常に短いスニペットで、g++ 4.7.1 ではコンパイルされません (ちなみに gcc 4.6.3 でもコンパイルされません)。
#include <iostream>
template<typename T>
struct Foo
{
template<typename U>
friend std::ostream& operator<<(Foo&, U&);
};
template<typename T, typename U>
std::ostream& operator<<(Foo<T> foo, U& u)
{
std::cout << u;
return std::cout;
}
int main()
{
Foo<int> f;
f << "bar";
return 0;
}
そして、これが gcc 4.7.1 の出力です (4.6.3 はほぼ同じことを言っています)。
/tmp/ccNWJW6X.o: 関数
main': main.cpp:(.text+0x15): undefined reference to
内 std::basic_ostream >& operator<< (Foo&, char const (&) [4])' collect2: ld が 1 つの終了ステータスを返しました
誰でも理由を説明できますか?
編集
私もclang 3.1で試しましたが、まったく同じことが言えます。