2015-01-01 3 views
1

Я компилирую некоторый код (который я написал и скомпилировал с помощью Microsoftsoft toolchain) с clang. Вот некоторые кусок кода, для которого я не понимаю ошибку:clang ошибка компиляции с помощью функции шаблона

#include <iostream> 
#include <bitset> 

template <int N> 
auto foo(int index, std::bitset<N> & already_given)->int 
{ 
     return 0; 
} 


auto bar()->void 
{ 
     auto const n = 10; 

     auto baz = std::bitset<n>{}; 
     for (auto i = 0; i < n; i++) { 
       std::cout << foo(i, baz) 
          << std::endl; 
     } 
} 

дает мне ошибку no matching function to call to 'foo'. Что является источником этой ошибки?

+0

Microsoft или набор инструментов лязг (с помощью компилятора MS)? Что именно, пожалуйста? –

+0

@ πάνταῥεῖ Я редактировал. Благодарю. – mookid

ответ

6

std::bitset шаблон класса, который принимает аргумент как std::size_t:

template< std::size_t N > 
class bitset; 

При выполнении auto baz = std::bitset<n>{};, n неявно преобразуемых в std::size_t, но в шаблоне аргумента дедукции типы должны точно соответствовать [temp.deduct .type]/р17:

If, in the declaration of a function template with a non-type template-parameter, the non-type template-parameter is used in an expression in the function parameter-list and, if the corresponding template-argument is deduced, the template-argument type shall match the type of the template-parameter exactly, except that a template-argument deduced from an array bound may be of any integral type.

не-тип параметра шаблона int N выводит аргумент из целых чисел, который не соответствует тип битового набора, поэтому у вас есть сбой дедукции.

Чтобы это исправить, необходимо изменить параметр, чтобы соответствовать типу:

template <std::size_t N> 
auto foo(int index, std::bitset<N>& already_given) -> int; 
1

bitset<N> представляет собой шаблон класса объявляется следующим образом [template.bitset]:

namespace std { 
    template <size_t N> class bitset; 
} 

Его не-тип параметра шаблона типа size_t, не int, [support.types]/р6:

The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object.

Таким образом, вы должны переписать шаблон функции следующим образом:

#include <cstddef> // size_t 

template <std::size_t N> 
//  ~~~~~~~~~~^ 
auto foo(int index, std::bitset<N> & already_given)->int 
{ 
     return 0; 
} 
+0

Нужна дополнительная цитата о том, почему это несоответствие типов вызывает дедукцию с ошибкой ([temp.deduct.type]/p17). –

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