0

为了保持一些代码的可读性并避免拼写错误,我public在头文件的类定义部分中使用了以下语句:

using Assembly_Tuple = std::tuple <std::vector <std::string>, Trigger_Map, Attribute_Map>;

我在头文件中声明一个函数Assembly_Tuple作为返回类型:

Assembly_Tuple merge_node_attributes(const std::string& node_name, std::string tmpl_name="");

我在源文件中定义函数:

Widget_Server_Interface::Assembly_Tuple 
Widget_Server_Interface::merge_node_attributes(const std::string& n, const std::string& t)
{
    //...
}

但是当我尝试编译时,出现以下错误:

src/WidgetServer/WidgetServerInterface.cpp:31:1: error: ‘Assembly_Tuple’ in ‘class Widget_Server_Interface’ does not name a type

但是,在定义内部,没有任何问题。

如果我将该行更改为令人震惊的:

std::tuple<std::vector<std::string>, Trigger_Map, std::map<int,Node_Value>>
Widget_Server_Interface::merge_node_attributes (...) {...}

没关系。显然,问题在于使用范围之外的别名,即使它是公共的并且我明确地调用了类命名空间。

我查看了 Bjarne 的书,但他没有在任何地方提到这是否合法。

这是使用 gcc 4.7。

大多数情况下,我只想知道为什么这是无效的。

4

0 回答 0