1

実験として、クラス テンプレート パラメーターに基づいて、パラメーターを変更せずに void メンバー関数を作成しようとしています。

#include <iostream>
#include <limits>

template<typename T>
class MyClass
{
public:
  void MyFunc(const typename std::enable_if<std::is_fundamental<T>::value, T> dummy = T());
  void MyFunc(const typename std::enable_if<!std::is_fundamental<T>::value, T> dummy = T());

};

template<typename T>
void MyClass<T>::MyFunc(const typename std::enable_if<std::is_fundamental<T>::value, T> dummy)
{
}

template<typename T>
void MyClass<T>::MyFunc(const typename std::enable_if<!std::is_fundamental<T>::value, T> dummy)
{
}

class Simple {};

int main(int argc, char *argv[])
{
  MyClass<int> myClass;
  myClass.MyFunc();

//   MyClass<Simple> myClass2;
//   myClass2.MyFunc();

  return 0;
}

ただし、エラー: オーバーロードされた 'MyFunc()' の呼び出しがあいまいです。! を除いてすべてが同じであるため、これらの関数のどちらか一方だけが定義されるべきではありません。それらの1つで?

4

3 に答える 3

4

::typeいいえ、最初に のtypedefに実際にアクセスする必要があります。次にenable_if、メンバーがテンプレートではないため、コードが機能しません。そのうちの 1 つは常に無効な宣言になります。

必要な::type修正を適用した後MyClass<int>、メンバーを呼び出そうとするずっと前に、コードをインスタンス化すると失敗します。

メンバーをメンバー テンプレートにし、enable_if含まれているクラス テンプレートのパラメーターではなく、メンバー テンプレートのパラメーターに依存させます。

于 2012-01-04T23:59:08.777 に答える
2

私が求めていたことを行うには、ダミーのテンプレート パラメーターを作成する必要があります。

#include <iostream>
#include <limits>

template<typename T>
class MyClass
{
public:
  template <typename U = T>
  void MyFunc(const typename std::enable_if<std::is_fundamental<U>::value, U>::type dummy = U());
  template <typename U = T>
  void MyFunc(const typename std::enable_if<!std::is_fundamental<U>::value, U>::type dummy = U());
};

template<typename T>
template<typename U>
void MyClass<T>::MyFunc(const typename std::enable_if<std::is_fundamental<U>::value, U>::type dummy)
{
}

template<typename T>
template<typename U>
void MyClass<T>::MyFunc(const typename std::enable_if<!std::is_fundamental<U>::value, U>::type dummy)
{
}

class Simple {};

int main(int argc, char *argv[])
{
  MyClass<int> myClass;
  myClass.MyFunc();

  MyClass<Simple> myClass2;
  myClass2.MyFunc();

  return 0;
}
于 2012-01-05T00:08:10.243 に答える
0

言う:

std::enable_if<std::is_fundamental<T>::value, T>::type
//                                              ^^^^^^
于 2012-01-04T23:55:33.023 に答える