Search code examples
c++c++11name-conflict

C++/ name conflict: how to exclude a previously defined function


I want to write log2() function for a new datatype that I defined myself Array. So it will look like this

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

despite other functions like sin, cos, etc, this one (log2) is not declared under std namespace. so even using the following

std::log2(A[i])

the compiler does not resolve that inside log2 is suppoed to be the built-in c function. I persist to use the same name (log2) for simplicity of the code.

This is the error message

error: invalid initialization of reference of type 'Array&' from expression of type 'double'

SOLVED: It worked when I switched to -std::C++ 11.


Solution

  • std::log2 was introduced in C++11. Make sure you have a C++11 compliant compiler (e.g. gcc4.8 or later, compile with -std=c++11), and use std::log2 inside your function.

    If you don't use std::log2, then the compiler cannot find the standard function (as you are not using namespace std;) and tries to use yours, which of course is not defined for doubles, and you get an error.

    My personal opinion is that you should try to avoid naming your function the same as a standard one, due to headaches that can later appear.