ヘッダー view.h:
template<class S, template<typename> class V>
void Operate(S c, const V<S>& vx);
template<class T, template<typename> class U>
class ViewBase
{
template<class S, template<typename> class V>
friend void Operate(S c, const V<S>& vx);
};
template<class T>
class ViewTypeA : public ViewBase<T, ViewTypeA>
{
};
template<class T>
class ViewTypeB : public ViewBase<T, ViewTypeB>
{
};
template<class S, template<typename> class V>
void Operate(S c, const V<S>& vx)
{
}
cpp で:
#include "view.h"
int main(int argc, char **argv)
{
Operate(5, ViewTypeA<int>());
Operate(5, ViewTypeB<int>());
}
gcc (-std=gnu++11 でコンパイル) はエラーを返します:
ビルド: コードブロックでデバッグ (コンパイラ: GNU GCC コンパイラ) main.cpp ||関数 'int main(int, char**)' 内: main.cpp|7|エラー: オーバーロードされた 'Operate(int, ViewTypeA&)' の呼び出しがあいまいです main.cpp|7|注: 候補は: view.h|25|注: void Operate(S, const V&) [with S = int; V = ビュータイプ A] view.h|9|注: void Operate(S, const V&) [with S = int; V = ViewTypeA; T = 整数; U = ビュータイプ A]
main.cpp|8|エラー: オーバーロードされた 'Operate(int, ViewTypeB)' の呼び出しがあいまいです main.cpp|8|注: 候補は: view.h|25|注: void Operate(S, const V&) [with S = int; V = ビュータイプ B] view.h|9|注: void Operate(S, const V&) [with S = int; V = ViewTypeB; T = 整数; U = ビュータイプ A]
ビルドに失敗しました: 2 つのエラー、0 の警告 (0 分、0 秒)
質問:
クラス テンプレートのパラメーターはまったく関係ないはずです。そうですか? あいまいさは、クラスのテンプレート パラメーターに基づいているようです。