命名空间方法无法调用

问题描述

我无法从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。函数定义具有未定义的行为,因为尽管返回类型为非空,但通过返回值(也不通过抛出)不存在该函数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...