我目前正在做一个使用模板计算标量产品(点积)的程序,而且我遇到了两件事的问题。
一个是:如何声明模板并从main调用它。 两个是:如何将数组传递给函数。
感谢任何帮助,谢谢
// scalarProduct.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <math.h> /* sqrt */
using namespace std;
template<typename T>
void scalarProduct(T a[], T b[])
{
T a[3];
T b[3];
this->a[] = a;
this->b[] = b;
T axb;
T roota;
T rootb;
T result;
axb = ((a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]));
roota = sqrt((a[0] * a[0]) + (a[1] * a[1]) + (a[2] * a[2])); // the formula for the Euclidean length of the vector A.
rootb = sqrt((b[0] * b[0]) + (b[1] * b[1]) + (b[2] * b[2])); // the formula for the Euclidean length of the vector B.
result = axb / roota * rootb;
cout << "Result: " << result;
};
int main()
{
int a[3];
int b[3];
cout << "Enter A: " << endl; // Vector A Input
cout << "X:";
cin >> a[0];
cout << "Y:";
cin >> a[1];
cout << "Z:";
cin >> a[2];
cout << "Ennter B: " << endl; // Vector B Input
cout << "X:";
cin >> b[0];
cout << "Y:";
cin >> b[1];
cout << "Z:";
cin >> b[2];
scalarProduct(a[], b[]);
system("pause");
return 0;
}
答案 0 :(得分:2)
对于问题的模板部分:
下面是声明和定义模板函数的格式:
template<compileTimeParameters>
returnType functionName(functionParameters) {
...;
}
并像这样调用它:
functionName<compileTimeParameters>(functionParameters);
例如,如果你想要一个用cout打印的功能,你可以这样做:
template<typename T>
void println(T value) {
std::cout << value << std::endl;
}
并像这样调用:
int main() {
//string
println<std::string>("yo yo yo print a newline");
//integer
println<int>(420);
//some other random type
println<myType>(someInstanceOfMyType);
}
如果编译器可以通过函数参数推导出模板参数,则不必在<>
括号内明确指定任何内容。例如:
int main() {
//compiler deduces that you are passing a const char[]
println("the compiler can figure out what I mean");
}
答案 1 :(得分:2)
在scalarProduct()中删除你的本地数组a和b - 你从传递给函数的参数中获取它们。另外,scalarProduct是一个函数,而不是类的方法,因此没有“this”可供引用。
在main()中只需调用:
scalarProduct(a, b);
它应该工作。
答案 2 :(得分:1)
您的问题不是模板,而是C ++基础知识,例如将数组传递给函数。
// scalarProduct.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <math.h> /* sqrt */
using namespace std;
template<typename T>
void scalarProduct(T a[], T b[])
{
/*
* remove this
T a[3];
T b[3];
this->a[] = a;
this->b[] = b;
*/
T axb;
T roota;
T rootb;
T result;
axb = ((a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]));
roota = sqrt((a[0] * a[0]) + (a[1] * a[1]) + (a[2] * a[2])); // the formula for the Euclidean length of the vector A.
rootb = sqrt((b[0] * b[0]) + (b[1] * b[1]) + (b[2] * b[2])); // the formula for the Euclidean length of the vector B.
result = axb / roota * rootb;
cout << "Result: " << result;
};
int main()
{
int a[3];
int b[3];
cout << "Enter A: " << endl; // Vector A Input
cout << "X:";
cin >> a[0];
cout << "Y:";
cin >> a[1];
cout << "Z:";
cin >> a[2];
cout << "Ennter B: " << endl; // Vector B Input
cout << "X:";
cin >> b[0];
cout << "Y:";
cin >> b[1];
cout << "Z:";
cin >> b[2];
//scalarProduct(a[], b[]);
scalarProduct(a, b);
system("pause");
return 0;
}
另外,如果你处理三维点,我认为创建struct Point
或class Point
是个好主意。如果你希望你的函数处理向量,那么使用指针或更好 std::vector
。