1

次のような複数の型を持つことができるクラスのベクトルを構築する必要があります。

#include <variant>
#include <vector>
#include "Field.h"

using namespace std;

int main()
{
    variant <int, float> v;
    vector <variant<Field<int>, Field<string>, Field<float>>> fdList;
    fdList[0].getName();
}

そして、これはヘッダーファイルですField.h:

#pragma once
#include <string>
#include <vector>

using namespace std;

template<class T>
class Field
{
public:
    Field();
    Field(string);
    void setName(string);
    string getName();
    bool isPrime();
    void toPrime();
    void toForeign(Field);
    ~Field();

private:
    string FD_Name;
    vector <T> records;
    bool isPrimeK = false;
    string message;
};

template<class T>
string Field<T>::getName()
{
    return FD_Name;
}

関数にアクセスしようとするとgetName()、Visual Studio から次のエラー メッセージが表示され続けます。

E0135 クラス "std::variant<Field, Fieldstd::string, Field>" にはメンバー "getName" があり
ません C2039 'getName': 'std::variant<Field,Fieldstd::string,Field>' のメンバーではありません

しかし、次のようにベクトルを定義すると、問題なく動作します。

vector <Field<int>> fdList;
fdList[0].getName();

どうすればこれを修正できますか?

4

2 に答える 2

1

標準ライブラリに関する問題については、まずドキュメントを確認することをお勧めします。の使い方についてはこちらをご覧くださいstd::variant

要するに、そのタイプは格納されているタイプstd::variantではないため、そのようなコンテンツにアクセスすることはできません。std::variantあなたの場合、最初にstd::variant::index()method を呼び出して中身を確認し、次に を呼び出して値を取得することをお勧めしますstd::get

于 2020-08-28T02:16:13.667 に答える