我一直在学习模板并尝试使用它进行一些编程。最近,我偶然发现了一个奇怪的行为,在此尝试总结一下。假设我们有以下头文件MyHeader.H
class Dit{...};
class B{...};
class A{
...
B & operator[] (Dit & it){...};
...
};
template <T> bar(T& t){
static_assert(!std::is_same(T,A)::value," in bar, T cannot be of type A");
...
};
和主要功能
include "MyHeader.H"
foo(B & b){...};
foo(int t){...};
int main() {
A a;
Dit it;
foo(a[it]); // the compiler has no problem in selecting the right overloaded foo
bar(a[it]); // the compiler tries to instantiated it with type A, and because of the static_assert, it fails.
return 0;
}
在bar(A a)
类型为a[it]
的情况下,为什么编译器会寻找B
定义?我还没有尝试过,但是如果使用
bar<B>(a[it]);
代替?当然,如果我这样做
B & temp=a[it];
bar(temp);
一切都可以编译。