如何解决错误:对“CrossProduct”的调用不明确
我在头文件中创建了一个名为 Vector 的模板类,比如 foo.h。这是我如何定义模板类和在类的对象上操作的函数的 MWE
#ifndef FOO_H_
#define FOO_H_
namespace foo {
template <class T,int dimensions> class Vector {
private:
T component_[dimensions];
public:
Vector(const T& a = 0) {
for (int i = 0; i < dimensions; i++)
component_[i] = a;
} // default/scalar constructor
const T& operator[](int i) const{
return component_[i];
} // read-only ith component of the vector
void set(int i,const T& a) {
component_[i] = a;
} // change ith component of the vector
};
typedef Vector<double,3> Point3D;
template <class T,int dimensions> T
operator*(const Vector<T,dimensions>& u,const Vector<T,dimensions>& v) {
T sum = 0;
for (int i = 0; i < dimensions; i++)
sum += u[i] * v[i];
return sum;
} // vector vector inner/dot product
Point3D Crossproduct(const Point3D&,const Point3D&);
double ScalarTripleProduct(const Point3D&,const Point3D&,const Point3D&);
Point3D VectorTripleProduct(const Point3D&,const Point3D&);
}
#endif // FOO_H_
这是 foo.h 的结尾。然后我在 foo.cpp 中定义了对 foo.h 中模板类的对象进行操作的三个函数。这是下面的代码。
#include "foo.h"
using namespace foo;
Point3D Crossproduct(const Point3D& a,const Point3D& b) {
Point3D c;
c.set(0,a[1] * b[2] - a[2] * b[1]);
c.set(1,a[2] * b[0] - a[0] * b[2]);
c.set(2,a[0] * b[1] - a[1] * b[0]);
return c;
} // vector cross product: a X b,defined only for 3D vectors
double ScalarTripleProduct(const Point3D& a,const Point3D& b,const Point3D& c) {
return a * Crossproduct(b,c);
} // scalar triple product: a . (b X c),defined only for 3D vectors
Point3D VectorTripleProduct(const Point3D& a,const Point3D& c) {
return Crossproduct(a,Crossproduct(b,c));;
} // vector triple product: a X (b X c),defined only for 3D vectors
现在,当我尝试使用 g++ foo.cpp -c
编译 foo.cpp 时,出现以下错误
foo.cpp:15:13: error: call to 'Crossproduct' is ambiguous
return a * Crossproduct(b,c);
^~~~~~~~~~~~
./foo.h:35:10: note: candidate function
Point3D Crossproduct(const Point3D&,const Point3D&);
^
foo.cpp:5:9: note: candidate function
Point3D Crossproduct(const Point3D& a,const Point3D& b) {
^
foo.cpp:20:25: error: call to 'Crossproduct' is ambiguous
return Crossproduct(a,c));;
^~~~~~~~~~~~
./foo.h:35:10: note: candidate function
Point3D Crossproduct(const Point3D&,const Point3D& b) {
^
2 errors generated.
^
我不确定出了什么问题。你能帮我解决这个问题吗?谢谢。
解决方法
Point3D CrossProduct(const Point3D&,const Point3D&);
内部的namespace foo
声明和全局命名空间中Point3D CrossProduct(const Point3D&,const Point3D&) { /*...*/ }
的定义所指的是不同的函数(前一个没有定义)。
请注意,using namespace foo;
仅影响名称解析,但不会自动将后续定义放置在明确指定的命名空间之外的任何命名空间中,在本例中为全局命名空间。
要修复,请确保在使用以下任一方法声明函数的同一命名空间中定义该函数。
Point3D foo::CrossProduct(const Point3D& a,const Point3D& b) {
/*...*/
}
namespace foo {
Point3D CrossProduct(const Point3D& a,const Point3D& b) {
/*...*/
}
}
,
这可能是因为你编译了这两个文件:
你在做什么
g++ -o foo foo.h foo.cpp
(用你的编译器替换 g++)
这将使 foo.h 出现两次(它包含在 foo.cpp 中),因此您有两个执行相同操作的函数,编译器无法决定选择哪一个。
头文件不应该那样编译,只能包含。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。