模板和矢量错误

时间:2011-12-06 20:18:55

标签: c++ file templates vector header-files

我不知道我做错了什么这是我第一次分离.cpp文件并使用模板和向量。我一直收到这两个错误:错误C2143:语法错误:在'<'之前缺少','和错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int

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 个答案:

答案 0 :(得分:3)

您需要显式实例化才能执行此操作,因为编译器在编译.cpp时不知道模板需要编译的类型。请参阅Explicit instantiation - when is it used?

答案 1 :(得分:3)

必须事先定义模板函数,以便编译器可以使用它。在单个文件中的main()之前定义它,或者在头文件中#include它。

总之,模板函数应该在头文件中定义。请参阅Why can templates only be implemented in the header file?

的答案

答案 2 :(得分:1)

据我记得,你不能分开模板的声明和实现。

答案 3 :(得分:0)

您需要两个文件中的includeusing。此时,您可能需要在其他答案中提到的显式实例化,但这些实例化将显示为链接器问题。

答案 4 :(得分:0)

如果要在不同模块之间共享,

write_vector需要位于头文件(writeVector.h)而不是.cpp文件中。有关您需要执行此操作的详细信息,请参阅C++ FAQ

我认为你的语法错误是因为你在writeVector.cpp中缺少using namespace std;?当你将它移动到头文件时,你不应该在那里使用这个指令,因为只要包含这个文件,它就会不必要地污染全局命名空间。相反,您应明确将vector的所有引用限定为std::vector

答案 5 :(得分:0)

在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] << " ";
}

你可以为cin做类似的事情。