0

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 にデリゲートしますが、上記をコンパイルするときに表示されるエラー メッセージを改善する方法があるかどうか疑問に思っていました。

4

0 に答える 0