我看到這個問題已經在各個地方進行了討論,例如這里、這里、這里和這里。但是,我仍然無法與上述問題聯系起來。
我的情況:我正在嘗試在 C 中實作一個簡單的通用訪問者模式。此模式中的主機是不同的寵物,它們位于一個名為 Pet.h 的檔案中。訪問者位于一個單獨的標頭中,稱為“訪問者.h”。
具體的 Pet 類accept、通用訪問者類(參見 Pet.h 中的注釋 0)和通用訪問者類visits是泛型 Pet 類。因此,存在自然的回圈依賴。
早些時候,當所有代碼都在一個標頭中時,沒有問題。現在有。為了說明,這里是 Pet.h 類。PS:我使用的是 Visual Studio 2017。
#pragma once
#include <string>
#include "Visitors.h"
namespace pet
{
class Pet {
public:
virtual ~Pet() {}
virtual void accept(temp_visitor::PetVisitor& v) = 0; //Comment 0 Pet accepts a gneric PetVisitor
virtual std::string getAnimal() = 0;
private:
std::string color_;
};
template <typename Derived>
class Visitable : public Pet {
public:
using Pet::Pet;
Visitable() = default;
Visitable(const std::string& animal) : animal_(animal) {}
void accept(temp_visitor::PetVisitor& v) override {
v.visit(static_cast<Derived*>(this));
}
std::string getAnimal() override
{
return animal_;
}
std::string animal_;
};
class Cat : public Visitable<Cat> {
using Visitable<Cat>::Visitable;
};
class Dog : public Visitable<Dog> {
using Visitable<Dog>::Visitable;
};
}
這是訪客.h 檔案。The void visit(pet::Pet* p) gives the following error "use of undefined type pet::Pet on using p->getAnimal()
#include<iostream>
#pragma once
namespace pet
{
class Pet; //Comment 1. Attempted forward declaration.
}
namespace temp_visitor
{
template <typename ... Types>
class Visitor;
template <typename T>
class Visitor<T> {
public:
virtual void visit(T* t) = 0;
};
using PetVisitor = Visitor<pet::Pet>;
class FeedingVisitor : public PetVisitor {
public:
void visit(pet::Pet* p) override { std::cout << "Feed veggies to the " p->getAnimal() << std::endl; } //Comment 2: Gives the following error "use of undefined type pet::Pet"
};
}
那么我該如何解決這個問題呢?
uj5u.com熱心網友回復:
您還需要將其FeedingVisitor移至新標頭和 cpp。在標題中,您將在 cpp 中 #include "Visitors.h"轉發宣告 Pet#include "Pet.h"
像 訪客.hpp 之類的東西
namespace pet {
class Pet; //Comment 1. Attempted forward declaration.
}
namespace temp_visitor
{
template <typename ... Types> class Visitor;
template <typename T> class Visitor<T>
{
public:
virtual void visit(T* t) = 0;
};
}
FeedingVisitor.hpp
#include "Visitors.h"
namespace temp_visitor
{
using PetVisitor = Visitor<pet::Pet>;
class FeedingVisitor : public PetVisitor {
public:
void visit(pet::Pet* p) override; // only declaration
};
}
FeedingVisitor.cpp
// move the definition to cpp
void temp_visitor::FeedingVisitor::visit(pet::Pet* p) {
std::cout << "Feed veggies to the " p->getAnimal() << std::endl;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521301.html
標籤:C 模板前向声明
