代码:
#include<iostream>
using namespace std;
template<class T, int N> class point {
T coordinate[N];
public:
point(const point<T,N>&);
const double& operator[](int i) const {
return coordinate[i];
}
};
template<class T, int N> point<T,N>::point(const point<T,N>&p)
{
for(int i=0;i<N;i++)
coordinate[i]=p.coordinate[i];
};
int main() {
point<int,2> P2;
point<double,3> P3;
cout<<P2[0]<<P3[1];
return 0;
}
输出:
prog.cpp: In function ‘int main()’:
prog.cpp:17: error: no matching function for call to ‘point<int, 2>::point()’
prog.cpp:11: note: candidates are: point<T, N>::point(const point<T, N>&) [with T =
int, int N = 2]
prog.cpp:18: error: no matching function for call to ‘point<double, 3>::point()’
prog.cpp:11: note: candidates are: point<T, N>::point(const point<T, N>&) [with T =
double, int N = 3]
prog.cpp: In member function ‘const double& point<T, N>::operator[](int) const [with
T = int, int N = 2]’:
prog.cpp:19: instantiated from here
prog.cpp:8: warning: returning reference to temporary
请帮我理清错误。
答案 0 :(得分:5)
由于您已经创建了自己的构造函数,因此未提供编译器生成的默认构造函数。因此,当您创建P2
而没有构造函数的参数时,您需要为其编译默认构造函数。
答案 1 :(得分:1)
当您声明类似的变量时,
point<int,2> P2;
它使用默认构造函数;它可以在两种情况下使用:
因为在这里你什么都不做:只声明一个空的默认构造函数:
template<class T, int N> class point {
//...
public:
point() {} // <-- default constructor
};
这将清除您的错误。
还有重要警告:
prog.cpp:8: warning: returning reference to temporary
那是因为你的operator []
。
改变这一行,
const double& operator[](int i) const
要,
const T& operator[](int i) const // for <int, N> you should return 'int' not 'double'
答案 2 :(得分:0)
问题在于这两行
point<int,2> P2;
point<double,3> P3;
您正尝试通过默认的无参数构造函数创建两个“点”对象。
但是,除非您不指定任何其他构造函数,否则不会自动生成此构造函数。实现默认构造函数将解决您的问题