Отсутствие аргументов шаблона и ошибок реализации класса

Я новичок в C ++ и SO, чтобы извиниться заранее, если все не до табака.

Ниже приведены первые несколько строк моей основной функции. Я получаю ошибку на 6-й строке: «Отсутствуют аргументы шаблона до c1». Как вы можете видеть далее, класс «complex» должен удвоить данные, которые должны быть инициализированы до 0 с помощью конструктора по умолчанию. входящий комплекс исправил эту ошибку, но я не считаю, что мне нужен шаблон в первую очередь. Другая проблема заключается в том, что после внесения этого изменения компилятор не распознает первую функцию-член, которую я использую «c1.get_real ()», которая, как я подозреваю, связана с добавлением аргумента шаблона.

#include <fstream> // For ofstream class declaration #include <iostream> // For cout, endl #include <Complex> // So we can access the complex class declaration (hint: see Complex.cpp) #include <string> 

Всего 1 ответ


Эта проблема

Если вы используете свой компилятор в операционной системе без учета регистра (Windows?), Эта строка:

#include <Complex> // So we can access the complex class declaration (hint: see  Complex.cpp)

приведет к включению стандартного заголовка <complex> (все строчные буквы), и поэтому шаблон std::complex будет загружаться. Обратите внимание, что в системе linux вы получите правильную ошибку (что заголовок Complex with upaercase) не найден.

Тогда у вас есть два сложных типа в вашем коде: std::complex и complex . Тот факт, что вы using namespace std создает complex и std::complex синонимы. Здесь возникает ваша ошибка.

Решение

Во-первых, если вам не нужен стандартный комплекс, не включайте его. Таким образом, в главном блоке используйте то же самое, что и в вашем complex.cpp :

#include "Complex.hpp"  // For YOUR complex class declaration

Во-вторых, избегайте using namespace std . По крайней мере, в ваших заголовках . Просто префикс стандартных объектов с помощью std:: . Или перечислите стандартные объекты, которые вы явно хотите использовать без префикса: using std::cout; ,

Дополнительное замечание: некоторые стили C ++ предлагают определить собственные имена классов с начальным капиталом. Это предотвращает конфликты с std. Но этот подход не является заменой рекомендаций, указанных выше, поскольку столкновения между именами будут возможны с другими библиотеками, которые могут использовать один и тот же стиль.


Есть идеи?

10000