[英]Why can't I call template class's function in declaration line?
在我的 class 分配中,我在模板 class 的声明行中调用了 function。
测试.h
template <typename T, char N, char C, typename K>
class MyClass
{
public:
static const char* Get()
{
}
};
template <char N, char C>
class MyClass<std::string, N, C, char>
{
private:
std::string x;
public:
void setX(size_t t){
x.resize(t);
}
void operator()(std::string y){
setX(y.size());
for (std::string::size_type i = 0; i < y.size(); i++) {
x[i] = y[i];
}
}
void print(){
for(int i = 0; i < x.size(); i++){
std::cout << x[i];
}
}
};
测试.cpp
int main(){
std::stringstream ss;
ss << "Hello";
MyClass<std::string, ' ', '*', char> tn( ss.str() ); <---- "This is where I got the error"
tn.print();
};
我得到了一个不匹配的 function 调用错误,但如果我像下面那样做,我没有错误:
int main(){
std::stringstream ss;
ss << "Hello";
MyClass<std::string, ' ', '*', char> tn;
tn( ss.str() );
tn.print();
};
编辑:这是完整的错误 output:
test.cpp: In function 'int main()':
test.cpp:15:52: error: no matching function for call to 'MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass(std::__cxx11::basic_stringstream<char>::__string_type)'
MyClass<std::string, ' ', '*', char> tn( ss.str() );
^
In file included from test.cpp:4:0:
test.h:17:7: note: candidate: MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass()
class MyClass<std::string, N, C, char>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.h:17:7: note: candidate expects 0 arguments, 1 provided
test.h:17:7: note: candidate: MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass(const MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>&)
test.h:17:7: note: no known conversion for argument 1 from 'std::__cxx11::basic_stringstream<char>::__string_type {aka std::__cxx11::basic_string<char>}' to 'const MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>&'
test.h:17:7: note: candidate: MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass(MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>&&)
test.h:17:7: note: no known conversion for argument 1 from 'std::__cxx11::basic_stringstream<char>::__string_type {aka std::__cxx11::basic_string<char>}' to 'MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>&&'
该错误与模板无关。 如果MyClass
不是模板,你会得到同样的错误。 这个
MyClass<std::string, ' ', '*', char> tn( ss.str() );
调用构造函数。 MyClass<std::string,' ','*',char>
没有匹配的构造函数,因此出现错误。
这适用于临时工:
MyClass<std::string, ' ', '*', char>{}.operator()( ss.str() );
如果你想在一行中压缩所有内容,你可以让operator()
返回对*this
的引用。 但是,通过将所有内容压缩在一行代码中并不会变得更易读。
PS:错误中提到的方法,例如这里:
candidate: MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass()
不是MyClass::operator()
。 它是构造函数。 如果您无法修改main
,则需要提供一个将字符串作为参数的构造函数。 这就是编译器在这里抱怨时要寻找的内容:
test.cpp:15:52: error: no matching function for call to 'MyClass<std::__cxx11::basic_string<char>, ' ', '*', char>::MyClass(std::__cxx11::basic_stringstream<char>::__string_type)'
MyClass<std::string, ' ', '*', char> tn( ss.str() );
^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.