2013-03-24 4 views
1

У меня возникают следующие настройки:C++ шаблон функции overlading вывод аргумента с сопзЬ аргумент

template <typename T> 
void foo(T& t); 
void foo(const int& t); 

void f() 
{ 
    int i; 
    foo(i); //Unresolved reference to "void foo<int>(int &)" 
    foo(const_cast<const int&>(i)); //Unresolved reference to "void foo(int const &)" 
} 

В первом вызове обув, компилятор пытается вызвать версию шаблона, так как аргумент нешаблонном один не соответствует типу i. Во втором вызове вызывается версия без шаблона. Я использую компилятор Microsoft C++ версии 10. Является ли это стандартным поведением? Если тип не соответствует точно, даже если он имеет только константный модификатор, то вызывается функция шаблона?

EDIT: Я знаю, что эти две функции не имеют определения, я просто указываю, о чем жалуется компоновщик, чтобы сделать его более понятным, что компилятор хочет вызвать.

+3

«Unresolved reference» - это то, как линкер говорит вам, что вы * объявили * что-то, но никогда не определили его. –

+0

Где у вас есть определение шаблона функции? – qPCR4vir

ответ

2

Это стандартное поведение? Если тип не соответствует точно, даже если он имеет только константный модификатор, то вызывается функция шаблона?

Да, это четко определено Стандартом.

Если нет точного соответствия, используется шаблон, так как экземпляр версия шаблона всегда лучше матча, чем тот, который требует преобразований (даже это int & для int const& преобразования).

-1

Это должно работать

#include <iostream> 

template <typename T> 
void foo(T& t) {} 
void foo(const int& t){} 

void f() 
{ 
    int i; 
    foo(i); //Unresolved reference to "void foo<int>(int &)" 
    foo(const_cast<const int&>(i)); //Unresolved reference to "void foo(int const &); 
} 

int main() 
{ 
    f(); 
} 
+2

Это не вопрос. – Nawaz

4

Да, это правильное поведение в соответствии со стандартом C++ 11.

В первом случае аргумент является ссылкой на целое число не const. Обе перегрузки жизнеспособны для разрешения этого вызова, но шаблон функции обеспечивает идеальное совпадение, в то время как перегрузка без шаблона требует преобразования квалификации.

Во втором случае оба являются идеальным совпадением, но одна из перегрузок - , а не шаблон функции, и поэтому он является лучшим кандидатом, чем шаблон функции. Пер § 13.3.3/1, на самом деле:

Учитывая эти определения, жизнеспособный функция F1 определяется, чтобы быть лучше, чем функция другой жизнеспособной функции F2, если для всех аргументов я, ИКСИ (F1) не хуже последовательность преобразования, чем ИКСИ (F2), а затем

- для некоторого аргумента у, ICSj (F1) является лучшей последовательности преобразования, чем ICSj (F2), или, если не то, что,

- контекст представляет собой инициализацию путем пользовательского преобразования (см. 8.5, 13.3.1.5 и 13.3.1.6) и стандартную конверсию n последовательности из возвращаемого типа F1 в тип назначения (то есть тип инициализированного объекта ) является лучшей последовательностью преобразования, чем стандартная последовательность преобразования от типа возврата F2 к типу назначения. [...] Или, если не то, что,

- F1 является функцией не-шаблон и F2 шаблон функции специализации, или, если не то, что,

- [...]

Смежные вопросы