リスト内のすべてのクラスで特定の関数を呼び出すユーティリティクラスを作成しようとしています。この背後にある目的は、クラス階層内のリフレクションの要素を自動化することです。バリデーションテンプレートの再帰的テンプレート関数の終了の問題
Visual Studio 2015を使用してC++コードをコンパイルしていますが、コンパイラで再帰関数と終了関数を区別できないため、再帰的テンプレート関数が展開されたときにコンパイルエラーが発生します。私がしました
error C2668: 'Meta<C,B,A>::callOnAllClasses': ambiguous call to overloaded function
could be 'void Meta<C,B,A>::callOnAllClasses<T,A,>(const T &)'
or 'void Meta<C,B,A>::callOnAllClasses<T,A>(const T &)'
:2015のVisual Studioでコンパイルされたときにこれは、次のエラーが発生し
#include <iostream>
template< typename ... BaseClasses >
class Meta
{
public:
virtual ~Meta() {}
template< typename T >
void call(const T& val)
{
callOnAllClasses<T, BaseClasses...>(val);
}
private:
template< typename T, typename HeadClass >
void callOnAllClasses(const T& val)
{
auto pObj = dynamic_cast<HeadClass*>(this);
if (pObj)
pObj->HeadClass::doSomething(val);
}
template< typename T, typename HeadClass, typename ... TailClasses >
void callOnAllClasses(const T& val)
{
auto pObj = dynamic_cast<HeadClass*>(this);
if (pObj)
pObj->HeadClass::doSomething(val);
callOnAllClasses<T, TailClasses...>(val);
}
};
class A
{
public:
void doSomething(int i)
{
std::cout << "A:" << i << std::endl;
}
};
class B
{
public:
void doSomething(int i)
{
std::cout << "B:" << i << std::endl;
}
};
class C : public B, public A, public Meta<C,B,A>
{
public:
void doSomething(int i)
{
std::cout << "C:" << i << std::endl;
}
};
int main()
{
C c;
c.call(5);
}
:
は、私は簡単なテストケースにクラスのコアを抽出しましたなぜかこれは間違っている可能性があります私は損失のビットで前にvariadicテンプレートを使用したことはありません。どんな助けでも大歓迎です!
私は、これが問題の核心だと思うが、私は絶対にわからせずにお答えする必要はありません。 https://godbolt.org/g/G8WZbE。 mainを 'に置き換えると、それはコンパイルされます:https://godbolt.org/g/sXTCBE。 '-std = C++ 1z'と同じ結果になります。コンパイラは、適切なオーバーロードを選択できるように、型としてパラメータを渡す必要があると思います。 –