C++ 请求转换为非标量类型
在关于泛型编程的家庭作业中,程序不是编译的。我应该通过只在指定的位置插入代码而不更改其他内容来解决这个问题。我试图通过重载运算符来实现这一点,以使编译器理解它们对该自定义类型的含义,但仍然会遇到相同的错误。我现在不知所措C++ 请求转换为非标量类型,c++,templates,generic-programming,C++,Templates,Generic Programming,在关于泛型编程的家庭作业中,程序不是编译的。我应该通过只在指定的位置插入代码而不更改其他内容来解决这个问题。我试图通过重载运算符来实现这一点,以使编译器理解它们对该自定义类型的含义,但仍然会遇到相同的错误。我现在不知所措 #include <iostream> using namespace std; template <typename T> struct TripleData { T m_first; T m_second; T m_thi
#include <iostream>
using namespace std;
template <typename T>
struct TripleData {
T m_first;
T m_second;
T m_third;
T getMean() {
return (m_first + m_second + m_third)/3;
}
// INSERT CODE HERE
void operator = (const T & value) {
m_first = m_second = m_third = value;
}
void operator += (const TripleData & tridata) {
m_first += tridata.m_first;
m_second += tridata.m_second;
m_third += tridata.m_third;
}
T & operator / (const T & divisor) {
return m_first/divisor;
}
//END OF INSERTED CODE
};
template <typename T, int N>
class GenericStaticMatrix {
T m_data[N];
public:
T & operator()(int i) {
return m_data[i];
}
int getSize() const {
return N;
}
T getMean() const {
T sum = 0; //Error: conversion from 'int' to non-scalar type 'TripleData<double>' requested
for (int i=0;i<N;i++) sum+=m_data[i];
T ret = sum/(double)N; //Error: conversion from 'double' to non-scalar type 'TripleData<double>' requested
return ret;
}
};
int main() {
const int size = 10;
int i;
GenericStaticMatrix<TripleData<double>,size> gsm_tdd;
for (i=0;i<size;i++) {
gsm_tdd(i).m_first = 1.1 + i;
gsm_tdd(i).m_second = 2.2 + i;
gsm_tdd(i).m_third = 3.3 + i;
}
cout << gsm_tdd.getMean().m_first <<endl;
cout << gsm_tdd.getMean().m_second <<endl;
cout << gsm_tdd.getMean().m_third <<endl;
return 0;
}
#包括
使用名称空间std;
模板
结构三重数据{
T m_优先;
T m_秒;
T m_第三;
T getMean(){
返回(m_first+m_second+m_third)/3;
}
//在这里插入代码
void运算符=(常量T和值){
m_first=m_second=m_third=value;
}
void运算符+=(常量TripleData和tridata){
m_first+=tridata.m_first;
m_second+=tridata.m_second;
m_third+=tridata.m_third;
}
T&算子/(常数T&除数){
首先返回m_/除数;
}
//插入代码的结尾
};
模板
类GenericStaticMatrix{
T m_数据[N];
公众:
T运算符()(int i)(&O){
返回m_数据[i];
}
int getSize()常量{
返回N;
}
T getMean()常量{
T sum=0;//错误:请求从“int”转换为非标量类型“TripleData”
对于(int i=0;i而言,TripleData
需要一般运行的代码是:
T sum = 0; // (A)
sum += m_data[i]; // (B)
T ret = sum / (double)N; // (C)
只需从该代码所暗示的隐式接口向后工作即可
// (A) implies non-explicit construction from an int
TripleData(int );
// (B) implies operator+=, you have this one almost right
TripleData& operator+=(const TripleData& rhs);
// (C) implies division by a **scalar** - this should NOT modify the object
TripleData operator/(double ) const;
您完全缺少了(A)
-您编写了一个赋值运算符,但tx=y;
不是赋值,而是。(B)
基本上是好的,而(C)
您使用了错误的操作数类型。我们使用的是一个双精度
,而不是一个三重数据
,至少由于此运算符定义,代码无效,因为它返回对临时对象T&运算符/(常量T&除数){返回m_first/除数;}运算符+=()
和operator=()
应该返回一个引用tho*this
,以允许运算符链接。另外,还应该正确实现operator=()
应该检查与此
的相等性。你知道吗,一旦解决方案上线,原则上它值零信用点吗?是的,我想我不应该使用void
。是的,我知道,但我只是把它作为练习来复习。无论如何,它不值得任何分数。就是这样。我把隐含的部分搞错了。我错了uld还将一个参考值返回给*此
,而不是使用void
我猜。谢谢!