2014-10-06 1 views
0

В следующем коде, я получаюошибка: ожидается, первичное выражение, прежде чем '(' маркер

In member function ‘void no_matches::test_method()’: 

error: expected primary-expression before ‘(’ token 

    auto subject = anagram("diaper"); 

код начинается здесь

#include "anagram.h" 
#define BOOST_TEST_MAIN 
#include <boost/test/unit_test.hpp> 

using namespace std; 

BOOST_AUTO_TEST_CASE(no_matches) 
{ 
    auto subject = anagram("diaper"); 
    auto matches = subject.matches({"hello", "world", "zombies", "pants"}); 
    vector<string> expected; 

    BOOST_REQUIRE_EQUAL_COLLECTIONS(expected.begin(), expected.end(), matches.begin(), matches.end()); 
}; 

Вот anagram.cpp

#include "anagram.h" 
#include <boost/algorithm/string/case_conv.hpp> 
#include <algorithm> 
#include <cctype> 
using namespace std; 
namespace 
{ 
    string make_key(std::string const& s) 
    { 
     string key{boost::to_lower_copy(s)}; 
     sort(key.begin(), key.end()); 
     return key; 
    } 
} 
namespace anagram 
{ 
    anagram::anagram(string const& subject) 
    : subject_(subject), 
    key_(make_key(subject)) 
{ 
} 
vector<string> anagram::matches(vector<string> const& matches) 
{ 
    vector<string> result; 
    for (string const& s : matches) { 
     if (s.length() == key_.length() 
     && boost::to_lower_copy(s) != boost::to_lower_copy(subject_) 
     && make_key(s) == key_) { 
     result.push_back(s); 
     } 
    } 
    return result; 
} 
} 

Здесь находится anagram.h

#if !defined(ANAGRAM_H) 
#define ANAGRAM_H 
#include <string> 
#include <vector> 
namespace anagram 
{ 
class anagram 
{ 
    public: 
     anagram(std::string const& subject); 
     std::vector<std::string> matches(std::vector<std::string> const& matches); 
    private: 
     std::string const subject_; 
     std::string const key_; 
}; 
} 
#endif 

Я не получаю эту ошибку на своей локальной машине. Я получаю его только при создании с https://travis-ci.org. Может кто-нибудь помочь мне найти ошибку?

+2

Вы можете написать код для определения 'anagram'? – CoryKramer

+0

Вы забыли точку с запятой в конце определения класса. –

+0

Здесь приведен код определения анаграммы. –

ответ

3

Вы положили class anagram внутри namespace anagram (плохая идея, ИМО), поэтому имя, которое вы, по-видимому, хотите, - anagram::anagram. Сам по себе anagram просто называет пространство имен.

Так, по крайней мере, на первый взгляд, кажется, код должен прочитать:

auto subject = anagram::anagram("diaper"); 

Как почему вы получите его на одной машине, но не другой: я предполагаю, что у вас есть несоответствующие файл , такой как один, содержащий using namespace anagram;, который отсутствует у другого.

+0

Когда я делаю anagram :: anagram («подгузник»), 'он говорит, что я не могу вызвать конструктор явно на моей локальной машине. Конечно, у меня нет каких-либо пространств имен в этом коде. –

+0

Да, попытка использовать «anagram :: anagram» без пространства имен была бы проблемой. Таким образом, мы в значительной степени рассмотрели реальную проблему: вам нужно правильно назвать класс для компилятора, чтобы найти его (и если у него разные имена на двух машинах, то неудивительно, что вам нужно * использовать * разные имена на эти машины). –

+0

Хорошо, как только я проверю это и сделаю обед, я отмечу это как правильное –