これはGCC 4.4でコンパイルできないのはなぜですか?名前空間の関数テンプレートのオーバーロード
template<typename T>
class A {
public:
void foo() {
}
private:
T x;
};
namespace Ns {
template<typename T>
void do_it (A<T> a) {
a.foo();
}
};
template<typename T>
void myfun (T x) {
Ns::do_it (x);
}
template<typename T>
class B {
public:
void bar() {
}
private:
T x;
};
namespace Ns {
template<typename T>
void do_it (B<T> b) {
b.bar();
}
};
int main() {
A<int> a;
B<int> b;
myfun (a);
myfun (b); // error: no matching function call to do_it(B<int>&)
return 0;
}
do_it
の名前空間と関係があります。その周りの名前空間を削除すると、コンパイルされます。
背景:私は、多くの異なるコンテナクラスで使用することができる機能のセットを構築しています。さまざまなインターフェイスを一様に処理するために、私は各コンテナクラスに対して多重定義されたフリースタンディング関数を使用します。これらの関数は、グローバル名前空間を混乱させないために、名前空間に入れなければならない。 B用
定義がそのように並べ替えのためのものとは異なるヘッダ・ファイルから来ると考えなければならないことは選択肢ではありません。
タイプミスです!はHTMLによって飲み込まれました。 –
VS 2010は上記のコードをコンパイルしていますが、これは正しいと思いますが、これは難しい例です。ニースの質問! –
VS2008と同じですが、私はそれをチェックしました。これはGCCのバグでしょうか、それともMicrosoftの解釈とは違うのでしょうか?それが名前空間なしで動作するという事実は、それがバグであることを指摘するだろうか? –