Поскольку вы выполняете целочисленное деление.
Как говорит @Noldorin, если оба оператора являются целыми числами, то используется целочисленное деление.
Результат 0.33333333 не может быть представлен как целое число, поэтому к результату присваивается только целочисленная часть (0).
Если любой из операторов является double
/ float
, тогда будет выполнена арифметика с плавающей запятой. Но у вас будет такая же проблема, если вы это сделаете:
int n = 1.0 / 3.0;
Проблема состоит в том, что шаблоны не являются классами - Вы обычно не пишете им в двух отдельных файлах. Шаблонные классы являются кодом, который компилятор использует к , генерируют классы. По сути, Ваш код реализации должен эффективно быть встроен, т.е. в заголовке, когда Вы обнаружили.
Для более полного объяснения , почему это должен быть этот путь, посмотрите FAQ C++, Облегченный .
Как правило необходимо вставить всех шаблонных членов заголовочного файла. Шаблоны компилируются в как - используемое основание, и следовательно все определение должно быть доступным везде, где они используются. Помещение кода в заголовочном файле решит ту проблему.
единственное время можно поместить шаблонное определение в файл CPP, когда шаблон будет только использоваться в этом файл CPP. Так как причина, то, что она соответствует стандарту, что все определение доступно для компиляции.
Перемещение содержания node.cpp к node.h решит проблему.
Странные Сценарии
С другой стороны, можно также поместить все в файл CPP и включать файл CPP. C++ гибок таким образом. Я только упоминаю это, потому что я видел в сделанном прежде. Я на самом деле ушиб челюсть, когда она поразила вершину моего стола.
Когда Вы использование node<int>
, Вы, скорее всего, не включали node.cpp. Поэтому компилятор не может инстанцировать node<int>::node<int>
конструктор. Обычно Вы помещаете весь шаблон кода, включая все реализации методов, в заголовочном файле или чем-то включенном от него.
Обычно принимаемая практика должна поместить всю реализацию в.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);
}
неявное инстанцирование выключено, Вам нужно
template class node<int>;
где-нибудь в Вашем коде (node.cpp, возможно)
РЕДАКТИРОВАНИЕ: плохой ответ, это - вероятно, не случай.
Если не будет вызов к функции, компилятор не произведет кода, и компоновщик не найдет его.
необходимо поместить функцию в заголовок, где это принадлежит.