簡體   English   中英

VC6和VS2008之間的模板功能行為

[英]template function behavor between VC6 and VS2008

我有關於Visual C ++ 6.0和Visual Studio 2008模板功能的簡單代碼。

#include <stdio.h>
#include <vector>

template<typename T>
void function(const std::vector<T> &vec)
{
    printf("vector version\n");
}

template<typename T>
void function(T val)
{
    printf("value version\n");
}

int main()
{
    std::vector<int> vec;
    function(vec);

    return 0;
}

我嘗試了每種環境,最后得到了
在VC6中, 版本的功能,以及
在VS2008中, 矢量版本的功能。

我有兩個問題。

  1. 我已經認識到重載函數調用的優先級如下,
    a)特殊功能(無隱式類型轉換)
    b)模板函數(無隱式類型轉換)
    c)特殊功能,具有隱式類型轉換
    d)模板函數,具有隱式類型轉換

    用這個規則,上面的結果似乎是
    在VC6中,b)被接受(<T> = std :: vector <int>)
    在VS2008中,b)被忽略(?),而d)被接受(?)(其中<T> = int)

    這意味着VC6有效,而VS2008錯誤。
    我的猜測不正確嗎?

  2. 雖然,我希望VC6和VS2008都需要向量版本。
    我可以做嗎?

問候。

其實VC6是錯誤的; MS在VC6中對C ++ 99標准(即模板標准化)的支持有限,而在VS2005及更高版本中具有更好的支持。

調用function(vec)調用

template<typename T>
void function(const std::template vector<T>& vec)

使用T作為int類型,因為該模板是從矢量模板類型推導的(與調用function<int>(vec) )。 如果您調用function(&vec)則將在您傳遞引用時調用值函數,該引用推導為function<std::vector<int>>(vec)

如果希望它總是調用適當的函數,則需要明確,因此需要這樣調用:

function< std::vector<int> >(vec)

這將推導為矢量版本。 注意>之間的空格,這是為了避免編譯器認為您的意思是流運算符>>

希望能有所幫助。

暫無
暫無

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

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