我试图用模板解决一个练习。
我的代码在大多数情况下都能正常工作,但是我发现有一种情况不起作用,这是我的代码的一部分。
默认比较器为
template <typename type1, typename typecomparator=less<typename type1::valuetype1> >
class Myclass
{
public:
Myclass ( const type1 & arg1,const typecomparator & comparator = typecomparator () )
{
this->seq=arg1;
this->comp=comparator;
}
~Myclass ( void ){}
// ...
private:
mutable type1 seq;
typecomparator comp;
};
代码几乎在所有情况下都有效。
范例:
Myclass <string> test ( "abcabcabc" );
但是当我想使用一个类时:
class another
{
public:
another ( bool caseSensitive )
: m_CaseSensitive ( caseSensitive ) { }
bool operator () ( const string & a, const string & b ) const
{
return m_CaseSensitive ? strcasecmp ( a . c_str (), b . c_str () ) < 0 : a < b ;
}
bool m_CaseSensitive;
};
bool upperCaseCompare ( const char & a, const char & b )
{
return toupper ( a ) < toupper ( b );
}
例:
Myclass <list<string>, another> t6 ( list<string>{"foo","done"}, another ( false )) ;
我得到这个错误。
index.cpp: In constructor ‘Myclass<type1, typecomparator>::Myclass(const type1&, const typecomparator&) [with type1 = std::list<std::basic_string<char> >, typecomparator = another]’:
index.cpp:67:136: instantiated from here
index.cpp:20:4: error: no matching function for call to ‘another::another()’
index.cpp:20:4: note: candidates are:
index.cpp:50:20: note: another::another(bool)
index.cpp:50:20: note: candidate expects 1 argument, 0 provided
index.cpp:47:7: note: constexpr another::another(const another&)
index.cpp:47:7: note: candidate expects 1 argument, 0 provided
index.cpp:47:7: note: constexpr another::another(another&&)
index.cpp:47:7: note: candidate expects 1 argument, 0 provided
我试图重写代码,但是我不明白如何解决此问题。
最佳答案
问题是您没有在构造函数中使用初始化列表,因此MyClass的成员是使用其默认构造函数首先构造的,然后才从参数中复制它们。使用
Myclass ( const type1 & arg1,const typecomparator & comparator = typecomparator () )
: seq(arg1), comp(comparator)
{
}
并且不再需要
another
的默认构造函数。关于c++ - 通用类的语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23289935/