2012-05-17 2 views
0

Следующий заголовок работает с комментировал часть, как и ожидалось, когда я вызываю функцию биту без аргументов:По умолчанию аргументы контейнера

class Test 
{ 
public: 

    void bat(std::vector<int> k = std::vector<int>()) {} 
    //void cat(std::map<int, std::vector<int> > k = std::map<int, std::vector<int> >()) {} 

}; 

Но когда я пытаюсь с помощью функции кота в заголовке:

class Test 
{ 
public: 

    void bat(std::vector<int> k = std::vector<int>()) {} 
    void cat(std::map<int, std::vector<int> > k = std::map<int, std::vector<int> >()) {} 

}; 

я получаю:

test.h:14: error: expected ',' or '...' before '>' token 
test.h:14: error: wrong number of template arguments (1, should be 4) 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:92: error: provided for 'template<class _Key, class _Tp, class _Compare,\ 
class _Alloc> class std::map' 
test.h:14: error: default argument missing for parameter 2 of 'void Test::cat(std::map<int, std::vector<int, std::allocator<int> >, std::less<int>, std::all\ 
ocator<std::pair<const int, std::vector<int, std::allocator<int> > > > >, std::vector<int, std::allocator<int> >)' 

Каким образом? И есть ли простые способы обхода? надеюсь, не требуя изменения типа указателя в интерфейсе?

Это мой полный заголовок:

#ifndef TEST_H 
#define TEST_H 

#include <map> 
#include <vector> 
#include <sstream> 
#include <iostream> 

class Test 
{ 
public: 

    //void bat(std::vector<int> k = std::vector<int>()) {} 
    void cat(std::map<int, std::vector<int> > k = std::map<int, std::vector<int> >()) {} 

}; 


#endif 

так все права включает в себя есть. Моя версия GCC ужасно устарела (ну не дома, я тоже стараюсь ее дома), но на работе это 4.1.2

+2

Пахнет GCC ошибка - [терпит неудачу с 4.3.4] (http://ideone.com/alZRI), [работает с 4.5.1] (http://ideone.com/6Ppze). Какую версию ты используешь? – ildjarn

+0

Это компилируется, вы включили ''? – AJG85

+0

Сообщение об ошибке будет указывать на 4.1.2 с включенным ''. – Mat

ответ

4

Код выглядит нормально, но сбой на gcc 4.3.4, см. here, но скомпилирован с 4.6 и выше (я не тестировал 4.4 или 4.5). Таким образом, похоже, что обходным путем является использование более нового gcc.

#include <map> 
#include <vector> 

class Test 
{ 
public: 

    void bat(std::vector<int> k = std::vector<int>()) {} 
    void cat(std::map<int, std::vector<int> > k = std::map<int, std::vector<int> > 
()) {} 

}; 

int main() { 

} 

Что касается параметров по умолчанию, это может быть идея отказаться от них вообще:

class Test { 
public: 

    void bat(std::vector<int> k) {} 
    void bat() {} 
    void cat(std::map<int, std::vector<int> > k) {} 
    void cat() {} 
}; 

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

+0

Сценарий реального случая - у меня была функция, которая отличалась от того, взяла ли она конечный контейнер или нет.перегрузка имела довольно много дублирующего кода и была очень раздражающей для поддержки, но я понял, что если дополнительный конечный контейнер был пуст, он прошел довольно плавно, чтобы быть версией без него, поэтому я объединил обе перегрузки и по умолчанию аргументировал окончательный контейнер на пустой. Я думаю, что обходным решением может быть обеспечение перегрузки без него, а просто пересылка вызова с пустым контейнером в единственную реализацию. –

+0

@PalaceChan да, это звучит как разумное решение. – juanchopanza

0

Код, который вы опубликовали, выглядит отлично, поэтому я собираюсь включить мой Модуль психического отладчика.

ли вам:

#include <vector> 

... в вашем заголовке?

+0

Да, я так и делал, это все больше похоже на эту ошибку, о которой говорят люди. –

0

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

#include <vector> 
#include <map> 

class Test 
{ 
public: 
    typedef std::map<int, std::vector<int> > MyMap; 

    void bat(std::vector<int> k = std::vector<int>()) {} 
    void cat(MyMap k = MyMap()) {} 

}; 

int main() 
{ 
} 
Смежные вопросы