使用 crtp 时,当您在基类和派生类中都有同名的成员函数时,是否有一种很好的方法来改进编译器生成的错误消息(可能以某种方式使用 static_assert)?
这是我的意思的一个例子:
#include <iostream>
using namespace std;
template<class T, class Ignore>
struct ignore { typedef T type; };
template<class T, class I>
using Ignore = typename ignore<T, I>::type;
template<class T>
struct A
{
template<class IgnoredParam = void>
auto foo() -> decltype(declval<Ignore<T*, IgnoredParam>>()->foo())
{
return static_cast<T*>(this)->foo();
}
};
struct B : public A<B>
{
//int foo() { return 42; };
};
int main()
{
B b;
auto i = b.foo();
cout << i << '\n';
}
在 gcc 4.7.1 上,对于上面的示例,错误消息并不是特别糟糕,您只需跳过超出最大模板递归限制的部分,但在与更深层嵌套的层次结构交互时可能会更糟。
这比问题更令人烦恼,通常我委托给 foo_impl,但我想知道是否有人有办法改进您在编译上述内容时收到的错误消息。