これは動作します:テンプレートクラスのネストされたクラスにフレンドオペレータの定義を提供するにはどうすればよいですか?
template<class Tim>
struct Bob
{
struct Dave
{
Tim t{};
friend bool operator < (const Dave& a, const Dave& b)
{
return a.t < b.t;
}
} d;
};
これは動作しません:
template<class Tim>
struct Bob
{
struct Dave
{
Tim t{};
friend bool operator < (const Dave& a, const Dave& b);
} d;
};
template<class Tim>
bool operator < (const typename Bob<Tim>::Dave& a, const typename Bob<Tim>::Dave& b)
{
return a.t < b.t;
}
私は例えばマップでそれを使用しようとすると、私はリンカエラーを取得:
1>ConsoleApplication1.obj : error LNK2019: unresolved external symbol "bool __cdecl operator<(struct Bob<int>::Dave const &,struct Bob<int>::Dave const &)" ([email protected][email protected][email protected]@@[email protected]) referenced in function "public: bool __thiscall std::less<struct Bob<int>::Dave>::operator()(struct Bob<int>::Dave const &,struct Bob<int>::Dave const &)const " ([email protected]@[email protected]@@@[email protected]@[email protected][email protected]@@[email protected])
。
int main()
{
std::map<Bob<int>::Dave, int> v;
v[{}];
}
どのように私は正しく外のクラス、この演算子を定義することができますか?
'警告:friend宣言 'bool operator <(const Bob :: Dave&const Bob :: Dave&)'はテンプレート以外の関数を宣言しています。それについて) - あなたが宣言した友人の '演算子' 'と、さらに定義する'テンプレート<...>演算子 ''は同じものではありません。 –
melak47
@ melak47 VS2015警告レベル4、私は警告を受けていません。 –
申し訳ありませんが、gccの出力を参照してください:http://coliru.stacked-crooked.com/a/bb58214d285f031f – melak47