Рассмотрим следующий пример.
#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;
}
Компиляция с использованием g ++ 4.3.0 выдает следующие ошибки компиляции:
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 );
}
Но все еще остается вопрос: почему он не создается автоматически?