Вот минимальный код, который показывает проблему:
template<typename To, typename From> To convert(const From& x);
struct A
{
int value;
template<typename T> A(const T& x) { value = convert<A>(x).value; }
};
struct B : public A { };
int main()
{
B b;
A a = b;
}
Это дает мне: undefined reference to 'A convert<A, B>(B const&)'
Как и ожидалось, я удалил конструктор копирования по умолчанию.Но если я добавлю эту строку в A
:
A(const A& x) { value = x.value; }
, я получу ту же ошибку.Если я попытаюсь сделать это следующим образом: (добавив шаблон специализации)
template<> A(const A& x) { value = x.value; }
Я получу: error: explicit specialization in non-namespace scope 'struct A'
.
Как это решить?
Мой компиляторMinGW (GCC) 4.6.1
РЕДАКТИРОВАНИЕ:
Функции convert
преобразуются из многих типов в A
и обратно.Проблема в том, что нет смысла писать функцию преобразования из B
в A
из-за наследования.Если я удаляю строку, которая вызывает convert
из A
, это просто работает.Идея состоит в том, чтобы вызывать convert
для всех случаев, которые не наследуются от A
, для них должно быть достаточно конструктора по умолчанию.