- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个类似于 QDebug 的简单记录器类,它有一个将数据保存到 QStringList 的模板方法。代码在这里:
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QTextStream>
class Logger
{
public:
Logger();
~Logger();
template <typename V>
Logger &operator<<(V const &value);
private:
QStringList msg;
};
inline Logger::Logger():
msg(QString("INFO:"))
{}
inline Logger::~Logger()
{
QTextStream out(stderr);
out << msg.join("");
}
template <typename V>
inline Logger &Logger::operator<<(V const &value)
{
msg << log(value);
return *this;
}
inline QString log(QString const &value)
{
return value;
}
inline QString log(int const (&value)[20])
{
return QString("Array");
}
int main(int argc, char *argv[])
{
Logger c;
int a[20] = {};
c << QString("test") << a;
return 0;
}
但是,这不能用 GCC 4.8.3 编译。
$ g++ -I/usr/include/qt4 -L/usr/lib64/qt4 -lQtCore -o test2 test2.cpp
test2.cpp: In instantiation of ‘Logger& Logger::operator<<(const V&) [with V = int [20]]’:
test2.cpp:50:29: required from here
test2.cpp:32:21: error: ‘log’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
msg << log(value);
^
test2.cpp:41:16: note: ‘QString log(const int (&)[20])’ declared here, later in the translation unit
inline QString log(int const (&value)[20])
确实,如果我将 inline QString log(int const (&value)[20])
移动到开头或进行前向声明,它会编译并运行。但让我感到困惑的是 inline QString log(QString const &value)
可以正常工作:
$ ./test2
INFO:testArray
我注意到 QHash 依赖于 qHash 函数,这在本例中是类似的。 QHash 可以很好地处理用户定义的键类(数组除外,它不能是函数返回类型)。
为什么他们的行为不同?我在这里错过了什么?
感谢您的帮助。
顺便说一句:你能告诉我什么是这个问题的好关键字吗?我试过“特化”"template"“前向声明”“QHash”和“用户定义类型”的组合,但它们不起作用。
最佳答案
名称 log
被查找了两次。在模板定义点,执行普通查找。它没有找到任何东西,因为此时未声明 log
。
然后,在实例化时,只执行依赖于参数的查找。当参数是 QString
类型时,会搜索全局命名空间,因为 QString
已在此处声明,因此会找到 log(QString)
。但是 int[]
类型没有任何关联的 namespace ,因此依赖于参数的查找没有任何可搜索的内容,也找不到任何内容。因此错误。
关于c++ - 模板方法何时可以使用稍后定义的函数,而无需前向声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24967635/
我正在编写一个插件,有一个ajax调用向用户显示数据。 如果用户想在ajax成功时添加一些js?他可以从他的 js 脚本中做到这一点吗,比如定位这个 ajax 成功事件。 例如: $(documen
我有 html 代码,例如 - x 最初插入 div 'insert_calendar_eda_form'。 Javascript代码 calendar_eda_add
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我已经使用命令 sudo start myservice 启动了一个 upstart 服务。我想要一种方法,以便稍后我(或任何人)可以检查该服务是否已启动并正在运行。检查它的命令是什么? 最佳答案 找
我是一名优秀的程序员,十分优秀!