2013-08-18 53 views
0

問題的簡單版本:當它的完整類型有一個尚未知的表單時,我可以轉發 - 聲明一個typedef嗎?

library.h

typedef library::whatever::something::complicated X; 

我可以不包含library.h前瞻性聲明X?


從本質上講就是我想要做的是這樣的:

了foo.h:

// forward declare X 

void foo (const X &); 

Bar.h:

#include <library> 
typedef library::type<blah>::whatever Bar; 
typedef Bar X; 

Foo.cpp中:

#include <Foo.h> 
#include <Bar.h> 

foo (const X &) {... 

main.cpp中:

#include <Foo.h> 
#include <Bar.h> 

foo (X()); 

的前提是,我不希望有包括<library>除非我不得不這樣做。假設它與其他頭文件交互不良,但這些其他頭文件需要foo的聲明。如果不包含庫,就無法調用foo(),但這是.cpps擔心的問題。

如果我想將X定義爲一個普通的類C,那麼只需向前聲明C就足夠了,但這在這裏不起作用。

只有我已經定義了library::type<blah>(也可能是blah的定義),我纔可以將X聲明爲typedef,但是AFAIK。

正向聲明的全部內容不是#include這些類型的定義。

這裏有一個相關的問題:

namespace std 
{ 
    template <typename T> 
    class vector; 
} 

typedef std :: vector <int> Buffer; 

void foo (const Buffer &); 

#include <vector> // ok until here 

int main() 
{ 
    foo (Buffer()); 
} 

在這種情況下性病的向前聲明::載體與定義不符。讓我們假裝我真的真的不想#include <vector>(或任何外部類是它)。

有沒有辦法解決這個問題?

回答

0

您不能轉發聲明嵌套的類,請參閱this answer

但是,如果你的類沒有嵌套,你可以這樣說:

// inside library_fwd.hpp: 
namespace library { 
namespace whatever { 

template <class T> 
class Something; 
typedef Something<int> IntSomething; 

} // namespace whatever 
} // namespace library 

和:

// inside foo.cpp 
#include "library_fwd.hpp" 
void foo(const library::whatever::IntSomething&); 

你用的std ::矢量例子問題是關於衝突的聲明。請參閱std::vector。 修正:

namespace std { 
    template <class T> 
    class allocator; 

    template <typename T, class Allocator> 
    class vector; 
} 

typedef std::vector<int, std::allocator<int>> Buffer; 

void foo(const Buffer &); 

#include <vector> // now ok 

int main() { 
    foo (Buffer()); 
} 

PS一些標準庫向前聲明的例如:http://en.cppreference.com/w/cpp/header/iosfwd

1

我認爲這很難做到,因爲typedef library::type<blah>::whatever Bar;需要class library :: type的完整定義,它不是可以解決的前向聲明。

相關問題