【发布时间】:2011-06-21 04:13:04
【问题描述】:
我正在拼命地尝试让我的专长发挥作用,但由于推断出不正确的参数,我仍然有不可编译的代码。请注意,错误不是关于定义模板,而是关于在错误的模板实现中应用不相关的操作。演示问题的代码的简化示例是:
struct Test { void Method() const {} };
template<typename T>
void Cmp(T _val) { _val > 1; }
template<>
void Cmp<const Test &>(const Test &_val) { _val.Method(); }
template<>
void Cmp<const char *>(const char *_val) { _val[2]; }
int main()
{
Test test1;
char test2[5];
Cmp(10); // ok, expected
Cmp(test1); // error in Cmp(T)?! but expecting to instantiate Cmp(const Test &)
Cmp(test2); // error in Cmp(T)?! but expecting to instantiate Cmp(const char *)
return 0;
}
我真的不希望使用像 Cmp<const Test &>(test1) 这样的显式调用(有效),因为 AFAIK 编译器应该能够自动推断参数,并且这些专业化背后的整个想法是透明地调度 Cmp 调用(在实际代码中,我正在定义运算符)。当然,按值特化 Cmp<Test>(Test) 按预期工作,但对于大型复杂的非 POD 类,按值传递它是荒谬的。
无论我尝试应用什么修复程序,编译器都会顽固地拒绝使用通用模板来选择按引用专业化。似乎我遗漏了一些重要的东西,但我真的很想知道为什么我的方法不起作用,以及我应该如何构造代码来表达来自非模板化 C++ 世界的这样一个简单概念的代码,作为通过引用传递类。当然,事实证明谷歌对这个问题完全没用。 ^_^ 我尝试了 GCC 4.2.1 和 4.4.6。
【问题讨论】: