0

以下のコードは問題ありません。

template <class T>
std::enable_if<std::is_atomic<T>::value, bool>
foo(T t) { return true; }

template <class T>
std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }

int main(void){
  foo(1);  // return true
  auto std::vector<int> a{2};
  foo(a);  // return false
}

しかし、クラスを使用してそれらをバンドルすると、コンパイルできません:

template <class T>
class test {
public:

std::enable_if<std::is_atomic<T>::value, bool>
foo(T t) { return true; }

std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }
};

int main(...) {
  test<int> obj;
  obj.foo(1);
  test<std::vector<int>> obj2;
  std::vector<int> tmp{2};
  obj2.foo(tmp);
}

クラン++印刷:

error: functions that differ only in their return type cannot be overloaded

だから私はコンパイラをだますために何かを書きます(2番目にSを追加しますfoo):

template <class S>
std::enable_if<tmp::is_sequence<T>::value, bool>
foo(T t) { return false; }

それはまだ動作しません:

error: no type named 'type' in 'std::enable_if<false, bool>'

クラスで機能させるにはどうすればよいですか?

4

3 に答える 3

1

enable_if :の後に::typeを追加するのを忘れました( enable_ifを参照)

template <class T> std::enable_if<std::is_atomic<T>::value, bool>::type
foo(T t) { return true; }
于 2013-11-07T06:14:26.473 に答える
0

両方のメンバー関数には、異なるテンプレート パラメーターが必要です (以下は問題なく動作します)。

template <class T>
class test {
public:

template<typename U>
typename std::enable_if<std::is_atomic<U>::value, bool>::type
foo(U t) { return true; }

template<typename U>
typename std::enable_if<tmp::is_sequence<U>::value, bool>::type
foo(U t) { return false; }

};
于 2013-11-07T05:58:28.053 に答える