模板c ++类中的typedef在定义类的一侧时不起作用吗?

时间:2015-08-20 14:37:46

标签: c++

我也尝试在我的模板c ++中使用typedef,但它不起作用,我不知道如何解决它。

template <typename object>
class MyVector
{
public:
    typedef object* iter;
    iter begin();
};

template <typename object>
iter MyVector<object>::begin() //here is problem
{

}
你可以告诉我它为什么不起作用吗?

4 个答案:

答案 0 :(得分:6)

iter在这种情况下并不意味着什么,你需要明确限定它:

template <typename object>
typename MyVector<object>::iter MyVector<object>::begin()
{

}

在C ++ 11中,您可以使用尾随返回类型:

template <typename object>
auto MyVector<object>::begin() -> iter
{

}

答案 1 :(得分:3)

因为编译器在遇到令牌iter时不知道它必须在MyVector<object>内搜索iter。明确提供iter的范围,如此:

template <typename object>
typename MyVector<object>::iter MyVector<object>::begin() //here is problem
{

}

答案 2 :(得分:2)

尝试以下

template <typename object>
class MyVector
{
public:
    typedef object* iter;
    iter begin();
};

template <typename object>
typename MyVector<object>::iter MyVector<object>::begin() //here is problem
{

}

Typename iter是类MyVector的成员,您必须使用该语法来访问类成员。

答案 3 :(得分:0)

MyVector<object>::iter 就像你在样本中的内部类型一样,你需要在主类之外的任何用法之前指定主类类型:

<body>

    <h1>AJAX Example</h1>
    <c:url value="/ajax/ajaxTime.html" var="url1" />
    <h2><div id="myDiv" data="${url1}">Let AJAX make this call</div></h2>
    <button type="button" onclick="loadXMLDoc()">View data time</button>

</body>

<script>
    function loadXMLDoc() {
        var xmlhttp;
        if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();
        } else {// code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
            }
        }

        xmlhttp.open("GET", document.getElementById("myDiv").getAttribute("data"), true);
        xmlhttp.setRequestHeader("X-Requested-With","XMLHttpRequest");
        xmlhttp.send();
    }
</script>