首先实现一个没有<
操作的类:
class Int {
private:
int a;
public:
Int(int b = 0) :a(b) { cout << "getting " << b << '\n'; }
};
然后实现一个能进行比较的容器类:
template <typename T>
class Vector {
private:
T* ptr;
size_t size;
public:
Vector(size_t n) :size(n) {
ptr = new T[n];
}
~Vector()
{
delete ptr;
}
bool operator<(Vector<T>& That) {
size_t i = 0, j = 0;
while (i < size && j < That.size) {
if (ptr[i] < That.ptr[j]) return true;
if (That.ptr[j] < ptr[i]) return false;
}
return (i == size && j != That.size);
}
};
如果在主函数里声明两个变量:
Vector<Int> v1(3), v2(3);
此时模板匹配已经完成,但是没有报错。如果尝试比较两个容器:
v1 < v2;
则会报错,因为Int
没有实现比较运算。
如果写一个普通函数:
void test(Vector<Int>& v1, Vector<Int>& v2) {
v1 < v2;
}
即便不调用也会报错。
问题:
容器不进行比较就不报错,是否说明成员函数有种惰性,不被调用就不去编译代码?
为什么普通函数没有这种惰性,即便没被调用也被查出错误?
PHP中文网2017-04-17 14:35:17
模板类的成员函数和模板函数,你不调用他就是真的不去看的。不过VC++和clang++对此还是有一些细节上的看法。VC++认为,成员函数的所有内容就是应该在被调用的时候才去检查的,而clang++认为,虽然不检查,但是你写的那些名字至少要被确认是存在的。
普通类的函数和普通函数,你一写他就检查。