0

string->bool などの暗黙的な型変換を許可しないことで、テンプレート クラス パラメーターの型チェックを実行しようとしています。これにより、コンパイル エラーがスローされます。具体的なシナリオは、次のような単純なものです。

#include <iostream>
#include <string>
using namespace std;

template <class T>
class myPair {
T a, b;
public:
  myPair(T first, T second ) {
  a = first;
  b = second;
  }
  void test();
};

typedef myPair<bool> boolParm;

template<class T>
void myPair<T>::test() {
  if(a == true) {
  cout << "a is true" << endl;
  } else {
  cout << "a is false" << endl;   
  }
  if(b == true) {
  cout << "b is true" << endl;
  } else {
  cout << "b is false" << endl;
  }
}

int main() {
  boolParm myObj(false, "false");
  myObj.test();
  return 0;
}

上記のシナリオの出力は、ユーザーがうっかりして bool と string の 2 つの型を渡し、最初の型を false として受け取る可能性があるため (bool として渡されたので正しい)、2 番目の型は true になる (文字列からの暗黙的な型変換のため正しくない) ため、望ましくありません。ブールする)。main() のユーザー コードを制限して、コンパイル エラーをスローし、string/int パラメーターをコンストラクターに渡すことを禁止したいと考えています。ブールのみを許可する必要があります。オーバーロードされたコンストラクター myPair(bool first, string second) を使用してみましたが、コンストラクターが呼び出される前に string->bool からの暗黙的な型変換が発生すると推測されるため、一致しませんでした。このシナリオでテンプレートの特殊化を使用するソリューションはありますか? どんな助けでも大歓迎ですありがとう

4

2 に答える 2

0

一見したところ、これは確かに奇妙な動作です。しかし、私が言える限り、それを禁止することはできません-boolとにかく、のようなプリミティブ型ではありません。

パラメータの暗黙的な変換は、あなたが発言する前に行われ、 からchar const *への暗黙的なプリミティブ型変換があるようboolです。

たとえば、この他の質問も参照してください

于 2013-10-07T06:35:59.310 に答える