[原因]
オーバーライドした関数の5つの戻り値型は、オーバーライドされた全く同じ
である、関数の戻り値型か、関数のクラスのcovariantのいずれかです。
class B { public : virtual B* f( ): } class D : public B { public : D* f( ); }関数D::f が 関数B::f をオーバーライドしているとすると、 次の基準を満たせば関数の戻り値型は covariant です。
(*)cv修飾子(cv-qualification)const、volatile、const volatile の修飾子
[原因]
コンパイラが、標準C++(14.5.5.2)
で明示されているテンプレート関数のPartial Orderingをサポートしていない。
ARMの第19章§14.4 にもPartial Orderingと言う言葉はないものの同説明がなされています。
引用します。
ある呼び出しに対して複数のテンプレート関数を選択することができる場合、 最も具体的に引数が指定されているテンプレート関数が選択される。例をあげる。試しにテストソース(1KB)を作成してみました。 やはりVC6.0(SP3)ではコンパイルエラーになります。が、g++では正常にコンパイルできます。template<class T> void f(T); // #1 template<class T> void f(T*); // #2 template<class T> void f(vector<T>*); // #3 void g(int i, char* pc, vector<int>* pv) { f(i); // #1 が使われる f(pc); // #2 が使われる f(pv); // #3 が使われる }
[原因]
コンパイラが標準C++で記されているArgument-dependent name lookup を完全に
サポートしていない。標準C++(3.4.2)
を参照すべし。そこにはArgument-dependenet name lookup に関する情報が記されている。
// compiler option : -GX #include <iostream> namespace T { struct T2 { }; void g( T2 ) { } T2 operator+( T2 a, T2 b ) { std::cout << "in T2::+" << std::endl; return b; } } int main( ) { T::T2 t1, t2; g( t1 ); // error C2065 (引数型から関数を特定できない) t1 + t2; // operator OK return 0; }(*) Koenig とは C++功労者Andrew Koenigのことであろう:-)
[原因]
コンパイラがテンプレート関数名を正確に装飾する上でこのバグが存在する。
Name Decoration は引数と戻り値型を使用し、明示的に特定されたテンプレート引数型
を使わない。
それゆえ、これら全てのテンプレート関数のインスタンス化は同じ修飾された名前と
なる。
明示的な(explicit)テンプレート引数の使用は標準C++ ( 14.8.1)にあります。
[備考]
このバグはコンパイルエラーもリンクエラーも起こさず、誤った実行結果を
出力します。ご注意下さい。
//test.cpp // compiler option needed: /GX #include <iostream> // テンプレート引数(class T)が関数foo の引数となっていない // 戻り値も使われていない template <class T> void foo( void ) { std::cout << typeid( T ).name() << std::endl; } int main( ) { foo<bool>(); foo<char>(); foo<int>(); return 0; } 出力結果: int int int
[原因]
コンパイラが標準C++(
14.5.4.1)で記されているクラステンプレートの部分特別バージョン
をサポートしていない。
// プライマリテンプレート template<class T, int I> struct A { void f(); }; template<class T, int I> void A<T,I>::f() { } // クラステンプレートの部分特別バージョン template<class T> struct A<T,2> { void f(); void g(); void h(); };
[原因]
コンパイラがメンバテンプレート関数やメンバテンプレートクラスのクラス外定義を
サートしていない。
標準C++(
14.5.2)にメンバテンプレートに関する情報が記されている。
template<class T> class string { public: template<class T2> int compare(const T2&); template<class T2> string(const string<T2>& s) {} // インラインの定義はOK // ... }; // この定義がエラーとなる template <class T> template<class T2> int string<T>::compare(const T2& s) { // body }
[原因]
コンパイラがテンプレート引数としてテンプレートをサポートしていない。
標準C++(
14.1の第2段落)にテンプレート引数に関する情報が記されている。
template<class T> class myarray { /* body */ }; template<class U, class V, template<class T> class C = myarray> class Map { C<U> key; C<V> value; }
by masu
e-mail: massun.masumoto@nifty.ne.jp
URL : http://member.nifty.ne.jp/~masumoto/