これはC++の標準であればわかりませんが、私のコンパイラ(G ++バージョン4.6.3、これは最新の長期的なものです質問に;-)std :: G ++で奇妙なことを交換する
コードを理解していない支援のUbuntuのバージョン)や私とは、次のように簡単です:
#include <algorithm> // for std::swap
void f(void)
{
class MyClass { };
MyClass aa, bb;
std::swap(aa, bb); // doesn't compile
}
G ++でコンパイルしようとすると、コンパイラは以下を生み出しますエラーメッセージ:
test.cpp: In function ‘void f()’:
test.cpp:6:21: error: no matching function for call to ‘swap(f()::MyClass&, f()::MyClass&)’
test.cpp:6:21: note: candidates are:
/usr/include/c++/4.6/bits/move.h:122:5: note: template<class _Tp> void std::swap(_Tp&, _Tp&)
/usr/include/c++/4.6/bits/move.h:136:5: note: template<class _Tp, long unsigned int _Nm> void std::swap(_Tp (&)[_Nm], _Tp (&)[_Nm])
#include <algorithm> // for std::swap
class MyClass { };
void f(void)
{
MyClass aa, bb;
std::swap(aa, bb); // compiles fine!
}
だから、それは、そのSTD ::スワップ()は、あるクラスで動作するようになっていません。驚くべき結果は、単に機能のうち、クラス定義を移動すると、コードが正常にコンパイルすることを作ることであり、機能にプライベート?または、これはG ++のバグですか、おそらくG ++の特定のバージョンですか?さらに不可解な
はMyListClassもプライベートであるにも関わらず(ただし、拡張スワップのためかもしれない特定の実装(「公式」クラスは、)が存在する)、次が再び動作していること、である:
#include <algorithm> // for std::swap
#include <list> // for std::list
void g(void)
{
class MyListClass : public std::list<int> { };
MyListClass aa, bb;
std::swap(aa, bb); // compiles fine!
}
しかし、オブジェクトからポインタに変更するだけで、コンパイルは再び失敗します。
#include <algorithm> // for std::swap
#include <list> // for std::list
void g(void)
{
class MyListClass : public std::list<int> { };
MyListClass aa, bb;
MyListClass* aap = &aa;
MyListClass* bbp = &bb;
std::swap(aap, bbp); // doesn't compile!
}
もちろん、実際のアプリケーションでは、クラスはより複雑です。問題を再現するためにできるだけコードを単純化しました。
[Apache wiki](http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport)によると、GCCはこれを4.5からサポートしているので、オプション '-std = c + + 0x 'となる。 – Angew
ありがとうございました! -std = C++ 0xを追加すると、ローカルクラスでもコンパイルがうまくいくようになります。うわー、私は古いC++標準のローカルクラスとテンプレートとの非互換性については知らなかった。 –