2012-05-29 3 views
1

Я пытаюсь создать строку, которая указывает на файл, и я получаю эту ошибку:Ошибка при конкатенации строк (C++)

.../testApp.cpp:75: error: invalid operands of types 'const char*' and 'const char [5]' to binary 'operator+'

Вот строка в вопрос:

string path = "images/" + i + ".png";   

Это кажется довольно простой проблемой, но это меня пугает. Я также включил строку заголовка:

#include <string> 
using namespace std 
+0

Какой тип 'i'? – hmjd

+0

@hmjd i is int – Miles

ответ

1

Вы пытаетесь конкатенации строковых литералов, как если бы они std::string объекты. Они не. В C++ строковые литералы имеют тип const char[], а не std::string.

Для объединения двух строковых литералов, поместите их рядом друг с другом, без оператора:

const char* cat = "Hello " "world"; 

Чтобы присоединиться к двум std::string объектов используйте operator+(std::string, std::string):

std::string hello("hello "); 
std::string world("world\n"); 
std::sting cat = hello + world; 

Существует также operator+ присоединиться строковый литерал и a std::string:

std::string hello("hello "); 
std::string cat = hello + "world\n"; 

Нет operator+, который принимает std::string и int.

Решение вашей проблемы заключается в использовании std::stringstream, который принимает любые operator<< что std::cout может принять:

std::stringstream spath; 
spath << "images/" << i << ".png"; 
std::string path = spath.str(); 
+0

_technicially_ string литералы будут конкатенации с std :: string и друг с другом (хотя с другим синтаксисом). Вы должны переделать часть 1. –

+0

Спасибо, @MooingDuck. Я обновил свой пост. –

3

Использовать stringstream вместо std::string не поддерживает выключение-стойки форматирования для целых чисел.

std::stringstream ss; 
ss << "images/" << i << ".png"; 
std::string path = ss.str(); 
4

Вы должны преобразовать i в std::string:

string path = "images/" + boost::lexical_cast<string>(i) + ".png"; 

Для других подходов преобразования int к std::string см Append an int to a std::string

4

или boost::format:

std::string str = (boost::format("images/%d.png") % i).str(); 

boost::format(FORMATTED_STIRNG) % .. %.. %.. предназначен для форматированной обработки строк, см. wiki. эта функция возвращает вам специальный формат форматирования, который нужно использовать для std :: string, используя функцию-член .str().

+0

Пожалуйста, не публикуйте только одну строку кода. Объясни это. -1 – Manishearth

+0

Извините, я считаю синтаксис вполне очевидным. но теперь я добавил объяснение. – guinny

+0

Undownvote-upvoted. Попытайтесь сделать это и для своих будущих должностей :) – Manishearth

0

Чтобы процитировать все другие ответы, да, std::string не имеет встроенной поддержки для добавления целых чисел.Тем не менее, вы можете добавить оператор, чтобы сделать только что:

template<typename T> 
std::string operator +(const std::string &param1, const T& param2) 
{ 
    std::stringstream ss; 
    ss << param1 << param2; 

    return ss.str(); 
} 

template <typename T> 
std::string operator +(const T& param1, const std::string& param2) { 
    std::stringstream ss; 
    ss << param1 << param2; 

    return ss.str(); 
} 

template <typename T> 
std::string& operator +=(std::string& param1, const T& param2) 
{ 
    std::stringstream ss; 
    ss << param1 << param2; 

    param1 = ss.str(); 
    return param1; 
} 

Единственный реальный недостаток этого вы должны сначала бросить один из литералов в строку, как этот:

string s = string("Hello ") + 10 + "World!"; 
+0

Я бы хотел тщательно протестировать это, прежде чем использовать его, это может привести к тому, что поведение корректного поведения certail неожиданно получит ошибку неоднозначности. –

1

С С ++ 11 мы получаем набор функций to_string, которые могут помочь преобразовать встроенные числовые типы в std :: string. Вы можете использовать это при преобразовании:

string path = "images/" + to_string(i) + ".png";