класс C++ с шаблоном не может найти своего конструктора

Поскольку вы выполняете целочисленное деление.

Как говорит @Noldorin, если оба оператора являются целыми числами, то используется целочисленное деление.

Результат 0.33333333 не может быть представлен как целое число, поэтому к результату присваивается только целочисленная часть (0).

Если любой из операторов является double / float, тогда будет выполнена арифметика с плавающей запятой. Но у вас будет такая же проблема, если вы это сделаете:

int n = 1.0 / 3.0;
15
задан Michael Kristofik 14 March 2009 в 00:57
поделиться

6 ответов

Проблема состоит в том, что шаблоны не являются классами - Вы обычно не пишете им в двух отдельных файлах. Шаблонные классы являются кодом, который компилятор использует к , генерируют классы. По сути, Ваш код реализации должен эффективно быть встроен, т.е. в заголовке, когда Вы обнаружили.

Для более полного объяснения , почему это должен быть этот путь, посмотрите FAQ C++, Облегченный .

23
ответ дан 1 December 2019 в 01:06
поделиться

Как правило необходимо вставить всех шаблонных членов заголовочного файла. Шаблоны компилируются в как - используемое основание, и следовательно все определение должно быть доступным везде, где они используются. Помещение кода в заголовочном файле решит ту проблему.

единственное время можно поместить шаблонное определение в файл CPP, когда шаблон будет только использоваться в этом файл CPP. Так как причина, то, что она соответствует стандарту, что все определение доступно для компиляции.

Перемещение содержания node.cpp к node.h решит проблему.

Странные Сценарии

С другой стороны, можно также поместить все в файл CPP и включать файл CPP. C++ гибок таким образом. Я только упоминаю это, потому что я видел в сделанном прежде. Я на самом деле ушиб челюсть, когда она поразила вершину моего стола.

13
ответ дан 1 December 2019 в 01:06
поделиться

Когда Вы использование node<int>, Вы, скорее всего, не включали node.cpp. Поэтому компилятор не может инстанцировать node<int>::node<int> конструктор. Обычно Вы помещаете весь шаблон кода, включая все реализации методов, в заголовочном файле или чем-то включенном от него.

1
ответ дан 1 December 2019 в 01:06
поделиться

Обычно принимаемая практика должна поместить всю реализацию в.h файле, так, чтобы классы могли быть сгенерированы из шаблона по мере необходимости.

, Если Вы знаете заранее, с которым инстанцируют типы Ваш шаблон, Вы могли бы быть в состоянии обмануть немного. Просто удостоверьтесь, что Ваш .cpp включает вариант использования для каждого типа и метода, в котором Вы будете нуждаться. Важно, чтобы вариант использования прибыл после шаблона кода. Например, для "node.cpp", используйте

#include "node.h"

template<class T>
node<T>::node (T data) {
    _data = data;
}

void dummy(void)
{
    node<int> intnode(0);
    node<double> doublenode(0.0);
}
1
ответ дан 1 December 2019 в 01:06
поделиться

неявное инстанцирование выключено, Вам нужно

template class node<int>;

где-нибудь в Вашем коде (node.cpp, возможно)

РЕДАКТИРОВАНИЕ: плохой ответ, это - вероятно, не случай.

0
ответ дан 1 December 2019 в 01:06
поделиться

Если не будет вызов к функции, компилятор не произведет кода, и компоновщик не найдет его.

необходимо поместить функцию в заголовок, где это принадлежит.

0
ответ дан 1 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: