我有这段代码:
struct All { public: All() {} ~All() {} };
template <typename T>
struct any : public All
{
public:
any() : All() {}
~any() {}
T value;
};
int main()
{
any<int>* a = new any<int>;
a->value = 55;
any<string>* b = new any<string>;
b->value = "Hello World !";
vector<All*> vec;
vec.push_back(a);
vec.push_back(b);
for (int i = 0; i < (int)vec.size(); i++) {
All* tmp = vec[i];
cout << tmp->value << endl; // Error appears here
}
return 0;
}
以下错误:
struct'All'没有名为'value'的成员
我不知道如何避免这个错误。似乎在for循环中tmp
是一个All对象,而All对象没有名为value的成员。
他们没有办法从All对象any
访问子结构(tmp
)成员变量以避免这个问题,并且有一个完全功能的通用向量?
答案 0 :(得分:0)
由于基类/派生类不是多态的-> value
,因此无法使用基指针类型进行访问。
您可以添加虚拟功能来打印该值。
#include <string>
#include <iostream>
#include <vector>
using namespace std;
struct All
{
public: All() {} ~All() {}
virtual void print() = 0;
};
template <typename T>
struct any : public All
{
public:
any() : All() {}
~any() {}
T value;
virtual void print() override
{
cout << value << endl;
}
};
int main()
{
auto a = std::make_shared<any<int>>();
a->value = 55;
auto b = std::make_shared<any<string>>();
b->value = "Hello World !";
vector<std::shared_ptr<All>> vec;
vec.push_back(a);
vec.push_back(b);
for (auto const& elem : vec)
{
elem->print();
}
return 0;
}