我正在尝试进行C ++练习,其中包含测试代码( main.cpp )和头文件( vcvec.h )。 测试代码应该保持不变,而包含的头文件应该满足测试代码(这是我必须从头开始编写的)。
在本练习中,我必须通过继承编写对std :: vector的扩展。我设法解决了本练习的大部分内容,现在,我将在下面仅附上代码的相关部分。
main.cpp(测试代码)
#include <string>
#include "vcvec.h"
int main()
{
version_controlled_vector<unsigned int> v;
version_controlled_vector<std::string> a;
v.push_back( 1 );
a.push_back("C++");
std::vector<std::vector<std::string> > hista = a;
std::vector<std::vector<int> > histv = v;
}
vcvec.h
#ifndef VCVEC_H
#define VCVEC_H
#include <vector>
template<class T>
class version_controlled_vector : public std::vector<T>
{
private:
std::vector<std::vector<T>> history;
};
#endif // VCVEC_H
此代码生成以下编译错误:
main.cpp: In function ‘int main()’:
main.cpp:12:52: error: conversion from ‘version_controlled_vector<std::basic_string<char> >’ to non-scalar type ‘std::vector<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >, std::allocator<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > > >’ requested
std::vector<std::vector<std::string> > hista = a;
^
main.cpp:13:44: error: conversion from ‘version_controlled_vector<unsigned int>’ to non-scalar type ‘std::vector<std::vector<int> >’ requested
std::vector<std::vector<int> > histv = v;
^
如何将version_controlled_vector的实例分配给std :: vector类型?我能想到的唯一解决方案是一个合适的复制构造函数,但它应该在std :: vector类中进行,因此它不是一个选项。
答案 0 :(得分:3)
这些是我能想到的选择:
提供一个返回对私有数据的引用的函数。
template<class T>
class version_controlled_vector : public std::vector<T>
{
std::vector<std::vector<T>> const& getHistory() {return history;} const
private:
std::vector<std::vector<T>> history;
};
然后,在客户端代码中,使用:
std::vector<std::vector<std::string> > hista = a.getHistory();
提供自动投射操作员功能
template<class T>
class version_controlled_vector : public std::vector<T>
{
public:
operator std::vector<std::vector<T>> const& () {return history;} const
private:
std::vector<std::vector<T>> history;
};
然后,在客户端代码中,使用:
std::vector<std::vector<std::string> > hista = a;
制作数据public
,以便其他人可以直接使用(不推荐)
std::vector<std::vector<std::string> > hista = a.history;
更新,以回应OP的评论
我不确定你的文件是怎么样的,但下面的代码,放在一个.cc文件中,为我编译和构建。
#include <vector>
template<class T>
class version_controlled_vector : public std::vector<T>
{
public:
operator std::vector<std::vector<T> > const& () {return history;}
private:
std::vector<std::vector<T> > history;
};
#include <string>
int main()
{
version_controlled_vector<unsigned int> v;
version_controlled_vector<std::string> a;
v.push_back( 1 );
a.push_back("C++");
std::vector<std::vector<std::string> > hista = a;
std::vector<std::vector<unsigned int> > histv = v;
}