问题描述
首先实现一个没有<操作的类:
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;}
即便不调用也会报错。
问题:
容器不进行比较就不报错,是否说明成员函数有种惰性,不被调用就不去编译代码?
为什么普通函数没有这种惰性,即便没被调用也被查出错误?
问题解答
回答1:模板类的成员函数和模板函数,你不调用他就是真的不去看的。不过VC++和clang++对此还是有一些细节上的看法。VC++认为,成员函数的所有内容就是应该在被调用的时候才去检查的,而clang++认为,虽然不检查,但是你写的那些名字至少要被确认是存在的。
普通类的函数和普通函数,你一写他就检查。