1

私はいくつかのコードを持っています。

#include <iostream>

template<typename T>
struct Test
{
   Test(bool v):flg(v) { }
   void func() { }
   typedef void (Test::*unspecified)();
   operator unspecified() const
   {
      return flg ? &Test::func : 0;
   }
   bool flg;
};

template<typename T>
std::ostream& operator << (std::ostream&, typename Test<T>::unspecified);

int main()
{
   Test<int> t(true);
   std::cout << t << std::endl;
}

出力は

1

正常に動作しますが、未定義の参照を取得したいと思います。もしそうならTestnot template class私は未定義の参照を取得します。では、なぜコンパイラは関数型に使用せず、からへoperator <<の標準変換を行うのでしょうか。pointer to class-memberbool

4

1 に答える 1

4

の左側に表示されるため、はtypename Test<T>::unspecified非推論コンテキストにあります。したがって、関数テンプレートは考慮されません。への変換は、実行可能な唯一のオーバーロードとして使用されます。T::unspecified

簡単に言えば、「テンプレートはそのようには機能しない」ということです。もっと長い答えが必要な場合はお知らせください。

于 2012-08-10T11:34:36.853 に答える