Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接器错误-朋友和左手边。(无模板)_C++_Operator Overloading_Linker Errors - Fatal编程技术网

C++ 链接器错误-朋友和左手边。(无模板)

C++ 链接器错误-朋友和左手边。(无模板),c++,operator-overloading,linker-errors,C++,Operator Overloading,Linker Errors,这是在程序中抛出错误的行:s和u是统计学家对象 s = 2*u; 错误C2678:二进制“*”:未找到接受类型为“int”的左侧操作数的运算符,或者没有可接受的转换 这是头文件: 这是C++文件: 我什么都找不到,我想我什么都试过了。我使用的是VS 2010 x64 Professional,在Win 7 x64 Professional上。您似乎正确地认识到,您需要在左侧提供另一个具有双精度的重载。统计员,double的op*过载不适用于double,统计员 当我取消注释头和实现中的两个运算

这是在程序中抛出错误的行:s和u是统计学家对象

s = 2*u;
错误C2678:二进制“*”:未找到接受类型为“int”的左侧操作数的运算符,或者没有可接受的转换

这是头文件:

这是C++文件:


我什么都找不到,我想我什么都试过了。我使用的是VS 2010 x64 Professional,在Win 7 x64 Professional上。

您似乎正确地认识到,您需要在左侧提供另一个具有双精度的重载。统计员,double的op*过载不适用于double,统计员

当我取消注释头和实现中的两个运算符时,它会给出链接器错误

您的项目设置配置错误,并且您没有链接到定义这些设置的实现文件。或者,您的构建可能配置错误,无法识别您已经修改了这些文件,需要重新构建它们。“全部清除/重建”将暂时修复后一个问题

我的第一个想法是错误的,问题是namespace指令。在实现文件中实际要做的是在不同的命名空间中定义另一个操作符重载。这使得主_savitch_2C命名空间中的重载未定义。而不是使用名称空间X;,将实现文件包装在命名空间X{和}中

这里有一个小例子来说明这个问题。它包含在一个文件中,因此不会出现多个TU链接问题

namespace a {
struct B {};
int operator+(B, int x);
}

using namespace a;

int main() {
  B() + 42;
  return 0;
}

int operator+(B, int) { return 0; }
如果最后一行位于main上方,则main中的表达式将不明确,这最清楚地表明您定义了单独的运算符重载:

example.cpp:8: error: ambiguous overload for ‘operator+’ in ‘a::B() + 42’
example.cpp:6: note: candidates are: int operator+(a::B, int)
example.cpp:3: note:                 int a::operator+(a::B, int)
一般来说,避免使用指令。Using指令使用名称空间X;;正在使用的声明正在使用X::name;,这些都很好。但是,指令在本地功能范围内很有用,这是我经常使用它们的唯一地方:

void example() {
  using namespace std;  // scoped to function
  cout << "blah\n";
}

似乎您已经正确地认识到,您需要在左侧提供另一个带有double的重载。统计员,double的op*过载不适用于double,统计员

当我取消注释头和实现中的两个运算符时,它会给出链接器错误

您的项目设置配置错误,并且您没有链接到定义这些设置的实现文件。或者,您的构建可能配置错误,无法识别您已经修改了这些文件,需要重新构建它们。“全部清除/重建”将暂时修复后一个问题

我的第一个想法是错误的,问题是namespace指令。在实现文件中实际要做的是在不同的命名空间中定义另一个操作符重载。这使得主_savitch_2C命名空间中的重载未定义。而不是使用名称空间X;,将实现文件包装在命名空间X{和}中

这里有一个小例子来说明这个问题。它包含在一个文件中,因此不会出现多个TU链接问题

namespace a {
struct B {};
int operator+(B, int x);
}

using namespace a;

int main() {
  B() + 42;
  return 0;
}

int operator+(B, int) { return 0; }
如果最后一行位于main上方,则main中的表达式将不明确,这最清楚地表明您定义了单独的运算符重载:

example.cpp:8: error: ambiguous overload for ‘operator+’ in ‘a::B() + 42’
example.cpp:6: note: candidates are: int operator+(a::B, int)
example.cpp:3: note:                 int a::operator+(a::B, int)
一般来说,避免使用指令。Using指令使用名称空间X;;正在使用的声明正在使用X::name;,这些都很好。但是,指令在本地功能范围内很有用,这是我经常使用它们的唯一地方:

void example() {
  using namespace std;  // scoped to function
  cout << "blah\n";
}

使用运算符方法unformated进行清理后再进行完整生成是否可以解决链接器问题?使用运算符方法unformated进行清理后再进行完整生成是否可以解决链接器问题?是的,我已经解决了这个问题,但感谢您花时间提供帮助!这是一个艰难的时刻!是的,我知道了,但是谢谢你花时间帮忙!这是一个艰难的时刻!
struct statistician {
  //...

  statistician& operator*=(double x) {
    // likely defined in implementation file, defined inline here for example
    _length *= x;
    _mean *= x;
    _minimum *= x;
    _maximum *= x;
    return *this;
  }
};

// usually defined inline in the header
inline
statistician operator*(double a, statistician b) {
  b *= a;
  return b;
}
inline
statistician operator*(statistician a, double b) {
  a *= b;
  return a;
}