在标题 view.h 中:
template<class S, template<typename> class V>
void Operate(S c, const V<S>& vx);
template<class T, template<typename> class U>
class ViewBase
{
template<class S, template<typename> class V>
friend void Operate(S c, const V<S>& vx);
};
template<class T>
class ViewTypeA : public ViewBase<T, ViewTypeA>
{
};
template<class T>
class ViewTypeB : public ViewBase<T, ViewTypeB>
{
};
template<class S, template<typename> class V>
void Operate(S c, const V<S>& vx)
{
}
在 cpp 中:
#include "view.h"
int main(int argc, char **argv)
{
Operate(5, ViewTypeA<int>());
Operate(5, ViewTypeB<int>());
}
gcc(使用 -std=gnu++11 编译)给出错误:
构建:在代码块中调试(编译器:GNU GCC 编译器) main.cpp||在函数'int main(int, char**)'中: main.cpp|7|error: 重载 'Operate(int, ViewTypeA&)' 的调用不明确 main.cpp|7|注意:候选人是: view.h|25|note: void Operate(S, const V&) [with S = int; V = ViewTypeA] view.h|9|note: void Operate(S, const V&) [with S = int; V = ViewTypeA;T = 整数;U = ViewTypeA]
main.cpp|8|error: 重载 'Operate(int, ViewTypeB)' 的调用不明确 main.cpp|8|注意:候选人是: view.h|25|note: void Operate(S, const V&) [with S = int; V = ViewTypeB] view.h|9|note: void Operate(S, const V&) [with S = int; V = ViewTypeB;T = 整数;U = ViewTypeA]
构建失败:2 个错误,0 个警告(0 分钟,0 秒)
问题:
类模板参数根本不应该出现在图片中 - 我是对的吗?歧义似乎是基于类的模板参数。