2016-01-05 3 views
1

Я хочу написать функцию log2() для нового типа данных, который я определил самостоятельно. Так это будет выглядеть следующим образомC++/name conflict: как исключить ранее определенную функцию

#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; 
} 

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

std::log2(A[i]) 

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

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

ошибка: недопустимый инициализация ссылки типа «Массив &» из выражения типа «двойной»

РЕШИТЬ: Он работал, когда я перешел на -std :: C++ 11 .

+0

Не понимаю, как название вопроса и фактический вопрос подходят друг другу. Возникает вопрос, как вы получаете ошибку компилятора/компоновщика. Отправьте это сообщение об ошибке. – IInspectable

+0

вот ошибка:> ошибка: неверная инициализация ссылки типа «TArray &» из выражения типа «double» –

+0

. Если вы включаете '', то он должен находиться в стандартном пространстве имен. –

ответ

6

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

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

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

+0

Я использую кодовые блоки с mingw. Это C++ 11? –

+0

Откройте терминал и введите 'g ++ --version', чтобы увидеть версию. Также убедитесь, что вы используете '-std = C++ 11', когда компилируете свой код. Однако может быть ошибка (я сообщил об этом на самом деле давно), см. Https://cygwin.com/ml/cygwin/2015-03/msg00247.html и http://stackoverflow.com/questions/28997206/cygwin -support-for-c11-in-g4-9-2 Не уверен, что затронута проблема. – vsoftco

+0

Я добавил -std = C++ 11, и он сработал. ! Спасибо –

-2

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

log2(A[i]); 

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

+0

в C++ 11, он объявляется под std :: как и другие встроенные математические функции в . Я добавил C++ 11, и он сработал. Его можно назвать std :: log2() –

+0

Это именно то, что делает код в вопросе, и это не сработало. –