Search code examples
c++stringgoogletest

(C++) error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]


I'm trying to write a function that would return a substring from the given start and end indices. This is the code that I've written but when i run it it gives me error. I'm using gtest to run it not main().

template <typename S>
S substring(S string_, int Istart, int Iend)
{
    S substr = string_[Istart];
    for(int i=(Istart+1); i<Iend; i++)
    {
        substr += string_[i];
    }
    return substr;    
}

And this is the error i get:

In file included from test.cpp:2:0:
lab2.cpp: In instantiation of ‘S substring(S, int, int) [with S = const char*]’:
test.cpp:56:1:   required from here
lab2.cpp:91:23: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
     S substr = string_[Istart];
                ~~~~~~~^

My test code is this:

TEST(subStr, T1){
string str="he";
EXPECT_EQ(str,substring("hello", 0, 2));
}
TEST(subStr, T2){
string str="urge";
EXPECT_EQ(str,substring("hamburger", 4, 8));
}

Solution

  • Assuming that the intended type is string. A += operator exists for the string type.

    A simple fix is to replace

    S substr = string_[Istart];
    

    with

    S substr;
    substr += string_[Istart];
    

    which will not work for const char* types as pointed out

    The following works for both string and const char*.

    #include <exception>
    #include <iostream>
    #include <functional>
    #include <string>
    #include <type_traits>
    
    template <typename S>
    S substring(S string_, int Istart, int Iend)
    {
        if constexpr (std::is_same_v<S, std::string>) {
            if(Istart < Iend){
                return string_.substr(Istart, Iend-Istart);
            }
        }
        else if constexpr (std::is_same_v<S, const char*>) 
        {
            if(Istart < Iend){
                std::string temp = std::string(string_);
                return (temp.substr(Istart, Iend-Istart)).c_str();
            }
        } 
        else throw;
    }