#include <iostream>
#include <vector>

class Dataset {
public:
   virtual void doSomething(int& data) = 0;
};

template<typename T1, typename T2> 
class Dataset_impl : public Dataset
{
protected:
   std::vector<std::pair<T1, T2> > _data_buffer;
   void doSomething(int &x) {};
};

template <typename T1=std::string, typename T2=std::string>
class OnlineDataset : public Dataset
{
public:
    void doSomething(int& data) override {};
};

template<typename T1, typename T2>
void foo(Dataset_impl<T1, T2> x) {}

int main() {
	Dataset_impl<int, int> y;
	foo(y);
	return 0;
}