c++ # define模板类型似乎不起作用

zqry0prt  于 2023-01-03  发布在  其他
关注(0)|答案(2)|浏览(168)

假设下面的代码:

#define __INIT_TYPE(type) { template<typename type>struct S{ };}

__INIT_TYPE(int);

int main(){
}

第二行产生以下错误

Function definition for '\__INIT_TYPE' not found. Expected a declaration.

1.为什么会发生这种情况?据我所知,宏必须被模板化的结构体所取代,而模板化的结构体将被声明并定义。
1.如果我只是遗漏了一些东西,而q.1有一个解决方案,那么在程序中用这样的宏嵌套类型是否被认为是一个坏习惯?

hxzsmxv2

hxzsmxv21#

在C中尽可能避免使用宏,它们大多是不好的做法。它们是类型不安全的,通常不会使代码更具可读性(对其他人来说)。如果可以的话,坚持使用标准的C
在您的例子中,__INIT_TYPE没有初始化任何东西,只是创建了S的一个模板示例。
如果你想要一个初始化的S示例,只需创建一个函数模板,用来创建你的结构体。

template<typename type_t>
struct S 
{ 
};

template<typename> 
auto make_S()
{
    return S<typename type_t>{};
}

int main()
{
    auto s = make_S<int>();
}
2wnc66cl

2wnc66cl2#

我们将宏定义为函数,函数体用大括号括起来,就像没有函数名的函数体一样:

#define __INIT_TYPE(type) { template<typename type>struct S{ };}

函数外部不允许使用大括号。您可能需要

#define __INIT_TYPE(type) template<typename type>struct S{ };

建议您查看What are the rules about using an underscore in a C++ identifier?以避免更多错误。

相关问题