其模板;-)给出以下模板成员函数和CRTP类:
template<typename T>
struct base
{
...
};
struct derived : public base<derived>
{
...
};
struct some_class
{
template<typename T>
void match(base<T>* array, size_t count)
{
...
};
template<typename T, size_t count>
void match(base<T> (&array)[count])
{
...
};
};
为什么编译器找不到第二个函数的匹配项:
derived array[10];
some_class foo;
foo.match(array, 10); // works fine
foo.match(array); // Error: no matching function for call to some_class::match(derived array[10])
我希望第二个模板函数可以减去编译时fixde数组大小,但显然不考虑该函数。为什么呢?
由于
编辑:奇怪的是以下版本编译得很好:
template<typename T, size_t count>
void match(T (&array)[count])
{
...
};
所以我怀疑在某些时候,由于某种原因我原先的版本被排除了。我只是看不到。
答案 0 :(得分:1)
Derived 数组不能转换为Base数组。如果您对数组执行了任何操作,除了访问第一个构造函数中的第一个元素,那么它将是Undefined Behavior。
正确引用引用可以保护您免受这种情况的影响,因为代码无法编译。但是,将通过将数组衰减到单个指针来进行编译,该指针可以衰减到指向Base的指针,这使得Base<T>*
重载可行,但仍然很糟糕。