Мне кажется, я понимаю, в чем ваша проблема: вы пытаетесь создать экземпляр этой функции с помощью класса Point, который имеет (только) конструктор с 1 параметром, ИЛИ класса Point с конструктором с 2 параметрами, ИЛИ класса Point с 3-х параметрическим конструктором. В любом случае вы получите ошибку компилятора о количестве параметров.
Фактически, вы можете создать экземпляр этой функции только с классом Point, который имеет конструктор с 1 параметром И конструктор с 2 параметрами И конструктор с 3 параметрами. Причина в том, что решение о том, какой конструктор вызывать, принимается во время выполнения , основываясь на значении file [i] .size ().
Подумайте об этом: что должно произойти, если вы вызовете эту функцию с классом Point, который имеет только двухпараметрический конструктор, но затем вы встретите строку в файле, где file [i] .size () == 3 ? Какую функцию должен вызывать код?
Чтобы эта функция работала, вам нужно перенести решение о том, какой конструктор вызывать, с времени выполнения на время компиляции. Вы можете сделать это, добавив целочисленный параметр шаблона, который задает размерность и обеспечивает специализации для 1, 2 и 3 измерений. Примерно так может работать:
template <typename Point, int N>
Point construct_point(const vector<string>& line);
template <typename Point>
Point construct_point<Point, 1>(const vector<string>& line)
{
assert(line.size() == 1);
return Point(atof ( line[0].c_str() ));
}
template <typename Point>
Point construct_point<Point, 2>(const vector<string>& line)
{
assert(line.size() == 2);
return Point(atof ( line[0].c_str() ), atof ( line[1].c_str() ));
}
template <typename Point>
Point construct_point<Point, 3>(const vector<string>& line)
{
assert(line.size() == 3);
return Point(atof ( line[0].c_str() ), atof ( line[1].c_str() ), atof ( line[2].c_str() ));
}
template <typename Point>
void List<Point>::load (const char *file)
{
...
for (unsigned i = 0; i < lines.size(); ++i)
{
// Assume each Point class declares a static constant integer named 'dimension'
// which is its dimension.
items.push_back(construct_point<Point, Point::dimension>(lines[i]));
}
...
}