0

ヘッダー 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 秒)

質問:

クラス テンプレートのパラメーターはまったく関係ないはずです。そうですか? あいまいさは、クラスのテンプレート パラメーターに基づいているようです。

4

0 に答える 0