我想传递类名oltosmol
作为参数,这样它将创建一个带有默认构造函数的对象。它通常可以工作,但在这里不行。而且问题只存在于oltosmol
。
error: request for member 'creator' in 'smolifier', which is of non-class type 'StatP::CharProcessor\<StatP::oltosmol\>(StatP::oltosmol)'
namespace StatP
{
class oltosmol
{
public:
oltosmol() {}
char transform(char c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
return c;
}
};
class Cutifier
{
unsigned period;
unsigned counter;
public:
Cutifier(unsigned p): period(p), counter(0) {}
char transform(char c)
{
if (counter == period)
{
counter = 0;
if (c == ' ')
return '\3';
else if (c >= 'a' && c <= 'z')
return c - 'a' + 'A';
else if (c >= 'A' && c <= 'Z')
return c - 'A' + 'a';
return c;
}
else
{
counter++;
return c;
}
}
};
template<class Transformer>
class CharProcessor
{
Transformer transformer;
public:
CharProcessor(const Transformer &t): transformer(t) {}
String<char> creator(String<char> &s)
{
char *n_data = new char[s.get_length() + 1];
for (unsigned i = 0; i < s.get_length(); i++)
n_data[i] = transformer.transform(s[i]);
n_data[s.get_length()] = '\0';
return String<char>(n_data);
}
void changer(String<char> &s)
{
for (unsigned i = 0; i < s.get_length(); i++)
s[i] = transformer.transform(s[i]);
}
};
}
int main()
{
const char coca_cola[] = "Coca-cola";
String<char> water_name = coca_cola;
copy = water_name;
// ...
StatP::CharProcessor<StatP::oltosmol> smolifier(StatP::oltosmol);
std::cout << smolifier.creator(water_name) << "\n\n";
return 0;
}
我试过添加()
并删除命名空间,但仍然不起作用。如果我先将对象赋给变量,程序会运行,但我不想也不应该这样做。
2条答案
按热度按时间goucqfw61#
此构造函数传递的指针指向您不打算传递的函数:
要执行您想要的操作,您需要示例化类,然后将其传递给
CharProcessor
:但是在您的情况下,更好的解决方案是从构造函数中移除引用,并通过值传递它,然后将它完全移到
CharProcessor
中;bq3bfh9z2#
在示例化
smolifier
时,必须传递一个示例化对象。在参数列表中写入类型是无效语法。这就是你需要的
注意,由于CTAD,您实际上不必拼写出类模板的类型参数,因为它可以从构造函数参数中推断出来。
(live demo,替换了某些类型,因为您没有提供它们)