две специализации шаблонной функции (int и int *).ошибка компиляции - PullRequest
0 голосов
/ 13 января 2012
template<int* A,int* B>
void f()
{
}
template<int A,int B>
void f()
{
}
void main()
{
    f<(int*)1,(int*)2>();
}

Мне бы хотелось иметь две специализации моего шаблона поиска f. Но этот код не скомпилирован. В чем проблема?

Error   1   error C2440: "specialization" : cannot convert from "int *" to "const int" line 11
Error   2   error C2973: invalid template argument "int *" line 11
Error   3   error C2440: "specialization" : cannot convert from "int *" to "const int" line 11
Error   4   error C2973: invalid template argument "int *" line 11
Error   5   error C2668: 'f' : ambiguous call to overloaded function line 11

Компилятор Visual C ++ 2010

1 Ответ

3 голосов
/ 13 января 2012

Вы пытаетесь использовать адрес в качестве параметра шаблона. Если вы попытаетесь скомпилировать код с помощью gcc или clang, вы получите gcc

test.cpp:11:13: error: a cast to a type other than an integral or enumeration type cannot     appear in a constant-expression
test.cpp:11:21: error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression

и в лягушке:

candidate template ignored: invalid explicitly-specified argument for template parameter 'A'

, что правильно, согласно этому ответу: Приведение указателя в качестве аргумента шаблона: компиляция Comeau и MSVC, сбой GCC

То есть, хотя указатели принимаются, они должны быть только указателями на именованные объекты с внешней связью.

...