c ++ 11 — конфликт C ++ / name: как исключить ранее определенную функцию

Я хочу написать функцию log2 () для нового типа данных, который я определил для себя Array. Так это будет выглядеть так

#include <iostream>
#include <cmath>

Array log2(Array& A)
{
Array C=A;

for (int i=0; i<A.size(); i++)
C[i]=log2(A[i]);

return C;
}

несмотря на другие функции, такие как sin, cos и т. д., эта функция (log2) не объявлена ​​в пространстве имен std. так что даже используя следующее

std::log2(A[i])

компилятор не определяет, что внутри log2 предполагается встроенная функция c. Я продолжаю использовать одно и то же имя (log2) для простоты кода.

Это сообщение об ошибке

ошибка: неверная инициализация ссылки типа ‘Массив&’из выражения типа’ double ‘

РЕШЕНО: Это сработало, когда я переключился на -std :: C ++ 11.

1

Решение

std::log2 был введен в C ++ 11. Убедитесь, что у вас есть компилятор, совместимый с C ++ 11 (например, gcc4.8 или новее, скомпилируйте с -std=c++11) и использовать std::log2 внутри вашей функции.

Если вы не используете std::log2то компилятор не может найти стандартную функцию (так как вы не using namespace std;) и пытается использовать ваш, который, конечно, не определен для doubleс, и вы получите ошибку.

Мое личное мнение таково, что вы должны стараться не называть свою функцию такой же, как у стандартной, из-за головной боли, которая может появиться позже.

6

Другие решения

Насколько я знаю, встроенная функция log2 не заявлено в namespace std,
Вы должны использовать следующий код для вызова стандарта log2 функция:

log2(A[i]);

Я надеюсь, что мой ответ помог.

-2

По вопросам рекламы [email protected]