Шаблон и векторные ошибки - PullRequest
       28

Шаблон и векторные ошибки

0 голосов
/ 07 декабря 2011

Я не знаю, что я делаю неправильно, я впервые разделяю файлы .cpp и использую шаблоны и векторы. Я продолжаю получать эти две ошибки: ошибка C2143: синтаксическая ошибка: отсутствует ',' before '<' и ошибка C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default-int </p>

main.cpp

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
void write_vector(const vector<T>& V);

int main()
{
    int n;
    int value;
    vector<int> V;
    cout << "Enter n: ";
    cin >> n;
    cout << "Enter " << n << " integer values: ";
    while(V.size() < n && cin >> value){
        V.push_back(value);
    }

    write_vector(V);

    return 0;
}

writeVector.cpp

template <typename T>
void write_vector(const vector<T> &V)
{
    for(int i=0; i < V.size(); i++)
        cout << V[i] << " ";
}

Ответы [ 6 ]

3 голосов
/ 07 декабря 2011

Ваша функция шаблона должна быть определена заранее, чтобы компилятор мог ее использовать.Либо определите его перед main () в одном файле, либо #include в заголовочный файл.

Таким образом, функции шаблона должны быть определены в заголовочных файлах.См. Ответ на вопрос Почему шаблоны могут быть реализованы только в заголовочном файле?

3 голосов
/ 07 декабря 2011

Для этого вам нужно явное создание экземпляра, потому что компилятор не знает, для каких типов шаблон должен компилироваться при компиляции .cpp.См. Явная реализация - когда она используется? .

1 голос
/ 07 декабря 2011

Насколько я помню, вы не можете разделить объявление и реализацию шаблона.

0 голосов
/ 07 декабря 2011

Вверху вас main.cpp добавьте:

#include "Vector.cpp" // since you are learning, this is really strange and should be avoided, but for your example we leave it as is.

В вашем Vector.cpp

#include <vector>
#include <iostream>

template<class T>
void write_vector(const std::vector<T>& V)
{
    for(int i=0; i < V.size(); i++)
        std::cout << V[i] << " ";
}

Не используйте операторы using. Плохая привычка. Вам не нужны явные экземпляры или другие вещи. Ваш компилятор может вывести правильный шаблон.

Хотя это работает, это плохой код. При использовании шаблона всегда пишите все в файле .h. Так что измените свой Vector.cpp на Vector.h. Удалите предварительную декларацию из вашего main.cpp и #include "Vector.cpp"

Ваш код будет работать без каких-либо изменений.

Наконец, C ++ может действовать, например, :

#include <vector>
#include <iostream>
#include <algorithm>

template<class T>
void write_vector(const std::vector<T>& V)
{
    std::copy(V.begin(), V.end(), std::ostream_iterator<T>(std::cout, " ")); // you don't even need this function right?
    //for(int i=0; i < V.size(); i++)
 //       std::cout << V[i] << " ";
}

Вы можете делать подобные вещи для чина.

0 голосов
/ 07 декабря 2011

write_vector должен находиться в файле заголовка (writeVector.h), а не в файле .cpp, если вы хотите поделиться им между различными модулями.Для получения дополнительной информации о том, почему вам нужно это сделать, см. C ++ FAQ .

. Я предполагаю, что ваша синтаксическая ошибка связана с отсутствием using namespace std; в writeVector.cpp?Когда вы перемещаете его в заголовочный файл, вы не должны помещать его в директиву using, потому что это будет без необходимости загрязнять глобальное пространство имен при каждом включении этого файла.Вместо этого вы должны явно квалифицировать все ссылки на vector как std::vector.

0 голосов
/ 07 декабря 2011

Вам нужны include s и using в обоих файлах. В этот момент вам может понадобиться явное создание экземпляров, упомянутое в других ответах, но они будут отображаться как проблемы с компоновщиком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...