簡體   English   中英

奇怪的C ++模板問題

[英]Weird C++ templating issues

因此,基本上我們必須創建一個雙重鏈接列表,這個列表一般是模板化的,而不是鎖定到單個數據類型。 我已經嘗試使用gcc和msvc進行編譯,兩個編譯器都給了我大致相同的錯誤,所以我假設它只是我的錯誤編碼,而不是一個編譯器或另一個編譯器的古怪。

目前,我收到錯誤,說我在linkList.h中的類不是模板

../linkList.h:34:錯誤:'llist'不是模板類型
../linkList.h:143:錯誤:'iter'不是模板類型
../josephus.cpp:14:錯誤:'llist'不是模板
../josephus.cpp:14:錯誤:聚合'llist ppl'的類型不完整,無法定義
../josephus.cpp:15:錯誤:'iter'不是模板

linkList.h


template<typename T>
class iter
{
public:
iter()
{
    position = sentin;
    container = sentin->payload;
}

T get() const
{
    assert(position != sentin);
    return position->payload;
}

void next()
{
    position = position->next;
}

void previous()
{
    position = position->prev;
}

bool equals(iter itr) const
{
    return position == itr.position;
}
private:
node *position;
llist *container;
};

josephus.cpp


llist<int> ppl;
iter<int> pos;

int start = static_cast<int>(argv[1]) - 1;
int end = static_cast<int>(argv[2]) - 1;

對此事的任何幫助都非常感謝

你的前瞻聲明說llist是一個類:

class llist;

然后你說它是一個模板:

template<typename T>
class llist;

iter類似。

我不知道你怎么能讓它容易編譯。 但是,您可以在llist創建nodeiter

llist不是一個類。 所以前面聲明它沒用。

template<typename T> class llist;

嘗試編譯代碼相對簡單。
你剛剛錯過了很多類型的模板部分。 搜索它的llist和節點,並確保它們具有適當的結尾。

如果你看一下STL,那么為了方便使用,可以輸入一些內部類型。 你可以遵循同樣的原則。

template<typename T>
class llist
{
     typedef iter<T>  Iter;
     typedef node<T>  Node;

      // The rest of the code.
};

有幾個問題。

class A;

不是你轉發聲明模板類的方式。

如果A有一個模板化參數,您需要說:

template<typename T>
class A;

如果你說過你已經說過class A;之后的話class A; 你自相矛盾。 下一個問題是simlar, friend class A; 如果A模板不起作用,你需要說friend class A<T>; 或類似的。 最后, static_cast<int>(argv[1])將不會編譯(雖然static_cast<int>(argv[1][0])會,但仍然不想要你想要)。 要將字符串有意義地轉換為整數,您需要使用atoistrtolstringstream等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM