次の例を検討してください。 G ++ 4.3.0を使用して、これをコンパイルするテンプレート関数参照の失敗
#include <iostream>
#include <boost/optional.hpp>
template < typename A >
int boo(const boost::optional<A> &a);
template < typename A >
int foo(const A &a)
{
return boo(a);
}
template < typename A >
int boo(const boost::optional<A> &)
{
return 3;
}
int main()
{
std::cout << "foo = " << foo(3) << std::endl;
std::cout << "boo = " << boo(3) << std::endl;
}
は、次のコンパイルエラーがスローされます。
dfg.cpp: In function ‘int main()’:
dfg.cpp:25: error: no matching function for call to ‘boo(int)’
dfg.cpp: In function ‘int foo(const A&) [with A = int]’:
dfg.cpp:24: instantiated from here
dfg.cpp:12: error: no matching function for call to ‘boo(const int&)’
は、私は(C++の標準からの参照を持つ可能な場合)違った何をすべきでしょうか? なぜそれが起こっているのですか、どうすれば修正できますか?
EDIT
修正はfoo
で正しい型を作成することです:
template < typename A >
int foo(const A &a)
{
const boost::optional<A> optA(a);
return boo(optA);
}
しかし、質問はまだ立っている:それは自動的に作成されていない理由?ここで
などのオプションを取るものとブーイングの独自のテンプレートを作成しますが、後押し::オプション< int >を作成する必要がある、ないだろうか? –
@VJo:私は自分の答えを編集しました。それをもう一度見てください。 – Nawaz