我现在已经解决了很多Euler问题,并且一直在考虑一种更聪明的方法来重用我为早期问题编写的函数。所以我想到制作一个包含我所有有用功能的头文件。到目前为止,我已经能够成功地将其包含在我的头文件中,没有任何错误。
#include <cmath>
bool isPrime(long int n)
{
if( n<=0 ) return false;
if( n==1 ) return false;
else if( n < 4 ) return true;
else if( n%2 == 0 ) return false;
else if( n<9 ) return true;
else if( n%3 == 0 ) return false;
else{
int r = floor(sqrt(n));
int f = 5;
while( f <= r ){
if(n%f == 0) return false;
if(n%(f+2) == 0) return false;
f += 6;
}
return true;
}
}
现在我想添加一个函数来打印出一个可以容纳任何类型变量的向量的内容,所以我想在我的头文件中做这样的事情,
#include <iostream>
#include <vector>
template <typename T>
T printVec(vector<T>* a){
for(int i=0; i<a->size(); i++)
cout << a->at(i) << ", ";
cout << endl;
}
然而,这有一些问题,是不是喜欢模板,它抱怨a
没有被声明?
请您告诉我如何完成这项工作?
谢谢
答案 0 :(得分:1)
std::
:
还有改进,const引用优于指针
template <typename T>
void printVec(const std::vector<T>& a) {
for (std::size_t i = 0; i != a.size(); ++i) {
std::cout << a.at(i) << ", ";
}
std::cout << std::endl;
}
或甚至(在C ++ 11中)
template <typename T>
void printVec(const std::vector<T>& a){
for (const auto& e : a) {
std::cout << e << ", ";
}
std::cout << std::endl;
}
或
void printVec(const std::vector<T>& a){
std::copy(a.begin(), a.end(), std::ostream_iterator<T>(std::cout, ", "));
std::cout << std::endl;
}
答案 1 :(得分:0)
只需在include之后添加namespace std;
即可确保使用命名空间std。如果使用C ++ 11,这可以解决您的问题:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
void printVec(vector<T> a){
for(auto vectorElement: a)
cout << vectorElement << ", ";
cout << endl;
}
int main(void){
vector<int> aVec = {1,2,3,4};
printVec(aVec);
}
请尝试此cpp.sh/8llel仅供参考。 请记住,printVec不返回任何内容,因此应将其声明为void。