2

オブジェクトのメンバーが入力と等しいかどうかを確認するコンパレータを作成しました。char[]; であるメンバーを除いて、これは魅力のように機能します。

私はインターネット、C++ ISO 標準を検索し、多くのことを試しましたが、わかりません。

これは単純化されたコードです:

/*
 * main.cpp
 *
 *  Created on: Nov 17, 2012
 *      Author: martijn
 */

#include <string.h>

class Data {
public:
    Data() {
        strcpy(Name, "MyCharArray");
    };
    virtual ~Data();

    char Name[12];
};

template <class ClassT, char (ClassT::*Name)[]> // What should be here?!
class Comparator {
public:
    Comparator() {};
    ~Comparator() {};
};

int main() {

    Comparator<Data, &Data::Name> comparatorArray;

    return 0;
}

問題の領域 (少なくとも私はそれを認識しています) はコードに示されています。現在のコードは正しくありません。コンパイラは次のように述べています。

エラー: テンプレート引数 '&Data::Name' を 'char (Data::*)[]' に変換できませんでした</p>

4

2 に答える 2

3

テンプレートパラメータタイプでバインドされた配列を指定する必要があります。

template <class ClassT, char (ClassT::*Name)[12]>

またはおそらく:

template <class ClassT, std::size_t N, char (ClassT::*Name)[N]>

使用済み:

// Note, this is a declaration of a function, is this correct?
Comparator<Data, 12, &Data::Name> comparatorArray();
于 2012-11-27T08:54:03.157 に答える
0

この種の質問に答える簡単な方法は、コンパイラのエラー メッセージを使用することです。

パラメータが渡されたときに明らかにコンパイルに失敗する汎用パラメータを使用してテンプレート関数を作成します。次に、エラー メッセージを見てください。通常、T が何であるかがわかります。私の伝統的なコンパイルの失敗は、サイズがゼロの配列です。コンパイラが賢明に使用int x[sizeof(T)-sizeof(expression with the same type as your test var)]されていても、一部の怠惰なコンパイラではゼロだけが機能する場合があります。

于 2012-11-27T12:55:35.373 に答える