使用CRTP类作为另一个本身是CRTP类(相同类型)的类的基础是否有效?
Clang(3.8.1)接受以下示例:
#include <iostream>
template <typename T>
class Printable {};
template <typename T>
void print(const Printable<T>& p)
{
static_cast<const T&>(p).print();
}
struct Foo : public Printable<Foo>
{
void print() const { std::cout << "hello" << std::endl; }
};
struct Bar : public Foo, public Printable<Bar> {};
int main()
{
Bar b;
print(b);
}
GCC(6.1)没有:
error: no matching function for call to 'print(Bar&)' print(b);
谁是对的?