如何解决命名空间方法无法调用
我无法从File2中的File1访问该方法,消息是“尚未声明”。
File1.cpp
library(tidyverse)
dat <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/cw2.csv')
dat$groups <- factor(dat$groups)
dat2 <- dat %>% group_by(groups) %>% summarize(mean_x = mean(x),mean_y = mean(y),.groups = 'drop')
dat %>% group_by(groups) %>% ggplot() + ## @@ BEFORE group_by(group) can I add a geom_smooth()
aes(x,y,color = groups,shape = groups)+
geom_point(size = 2) + theme_classic()+
stat_ellipse(level = .6) +
geom_point(data = dat2,mapping = aes(x = mean_x,y = mean_y,fill = factor(groups)),size = 4,show.legend = F,shape=21) +
geom_smooth(data = dat2,group=1),method = "lm",se=F,color = 1,formula = 'y ~ x')+
scale_fill_manual(values=rep('black',3))
File2.cpp
namespace n1
{
namespace
{
bool method(int x)
{
return x;
}
}
}
解决方法
您必须将第一个头文件包含在第二个头文件中。否则,第一个头文件中的声明在第二个头文件中不可见。
或者您也可以将两个头文件都包含在使用TEST_F
的编译单元中。
或者您可以将两个文件中的从属声明合并到一个头文件中。
更新代码后,将文件命名为cpp文件,然后出现的问题是您将cpp文件一个接另一个地包含在内。在某些编译单元中,一个cpp文件中的声明在另一个cpp文件中不可见。或者问题可能是两个文件都递归地包含彼此。
您应该如上所述将两个cpp文件中的声明移到头文件中。请勿将通用声明放在cpp文件中。
,我无法从File2中的File1访问该方法
的确。一个翻译单位不了解其他翻译单位中的声明。由于您是在File2.cpp中调用该函数的,因此必须在该转换单元中声明该函数。
该问题的解决方案:在使用声明的文件中声明函数:
// File2.cpp
namespace n1
{
namespace
{
bool method(); // see next paragraph
}
}
现在,我们还有另一个问题。匿名名称空间中的函数是隐式静态的。静态函数必须在使用ODR的所有翻译单元中定义。因此,声明毕竟是不够的。我们需要定义:
// File2.cpp
namespace n1
{
namespace
{
bool method()
{
} // see addendum
}
}
现在,由于从未调用File1.cpp中的函数,并且文件中没有任何其他内容,因此我们实际上可以删除该文件。
P.S。函数定义具有未定义的行为,因为尽管返回类型为非空,但通过返回值(也不通过抛出)不存在该函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。