我不知道我做错了什么这是我第一次分离.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] << " ";
}
答案 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)
您需要两个文件中的include
和using
。此时,您可能需要在其他答案中提到的显式实例化,但这些实例化将显示为链接器问题。
答案 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做类似的事情。