微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误:对“CrossProduct”的调用不明确

如何解决错误:对“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 举报,一经查实,本站将立刻删除。