gpt4 book ai didi

c++ - 无法识别 .h 文件中定义的 typedef 类型

转载 作者:太空狗 更新时间:2023-10-29 22:58:48 25 4
gpt4 key购买 nike

我在让编译器识别 .tem 文件中函数模板的返回类型时遇到问题(用于将实现与 .h 文件分开)。

In file included from tests/Graph.h:57:0,
from tests/test1.cpp:3:
tests/Graph.tem:28:2: error: ‘reference’ does not name a type
reference Node_Iterator<N, E>::operator*() const {
^~~~~~~~~
tests/Graph.tem:33:2: error: ‘pointer’ does not name a type
pointer Node_Iterator<N, E>::operator->() const {

不知道我做错了什么。我使用 typedef 来定义返回类型的类型。

/* 
* File: Graph.h
*/

#ifndef _Graph_h
#define _Graph_h

#include <vector>
#include <algorithm>
#include <string>
#include <memory>
#include <iostream>
#include <exception>
#include <map>
#include <set>
#include <typeinfo>

namespace gdwg {

template <typename N, typename E> class Graph; // function prototype for Graph class

//-----------------------------------------------------------
// Iterators for Graph with Nodes N and Edges E
//-----------------------------------------------------------

// Iterator class for Node N
template <typename N, typename E> class Node_Iterator {

public:
typedef typename Graph<N, E>::Node Node;

typedef std::ptrdiff_t difference_type;
typedef std::forward_iterator_tag iterator_category;
const typedef N value_type;
const typedef N* pointer;
const typedef N& reference;

// operators for value and reference types
reference operator*() const;
pointer operator->() const;



private:
bool end;
typename std::vector< std::shared_ptr<Node> >::iterator it;
typename std::vector< std::shared_ptr<Node> > mynodes_;

};


#include "Graph.tem" // definition/implementation of Graph, Node_Iterator and Edge_Iterator classes

}

#endif

这是 .tem 文件,它是 Graph.h 文件的实现,我将其包含在 .h 文件的底部。

#include <vector>
#include <algorithm>
#include <string>
#include <memory>
#include <iostream>
#include <exception>
#include <map>
#include <set>
#include <typeinfo>

namespace gdwg {

//-----------------------------------------------------------
// Implementation of Iterator class for Node N
//-----------------------------------------------------------

// operators for value and reference types
template <typename N, typename E>
reference Node_Iterator<N, E>::operator*() const {
return (*it)->val_;
}

template <typename N, typename E>
pointer Node_Iterator<N, E>::operator->() const {
return &(operator*());
}




}

最佳答案

  1. 为它们添加限定名称(使用 typename 关键字,参见 Where and why do I have to put the “template” and “typename” keywords? ),例如:

    typename Node_Iterator<N, E>::reference ...
    typename Node_Iterator<N, E>::pointer...

  2. Graph.h , #include "Graph.tem"在命名空间 gdwg 的定义中,并在 Graph.tem , 该函数在另一个命名空间内定义 gdwg ,然后它们将在命名空间 gdwg::gdwg 中定义.你可以移动#include "Graph.tem"Graph.h 中的命名空间定义之外,或删除 Graph.tem 中的命名空间定义.

关于c++ - 无法识别 .h 文件中定义的 typedef 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39444940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com