1. 程式人生 > >自定義C++ trim函數出現的小問題

自定義C++ trim函數出現的小問題

在地址

http://blog.csdn.net/butterfly_dreaming/article/details/10142443

中,關於trim函式的方法3:gcc編譯器不能通過問題。

       這是該程式碼:

/* 
Filename : stringTrim1.cpp
Compiler : Visual C++ 8.0
Description : Demo how to trim string by other method.
Release : 11/18/2006
*/
#include <string>
#include <iostream>
#include <cwctype>

template <class T>
std::basic_string<T>& trim(std::basic_string<T>&);

int main( ) 
{
    std::string s = " Hello World!! ";
    std::cout << s << " size:" << s.size() << std::endl;
    std::cout << trim(s) << " size:" << trim(s).size() << std::endl;

    return 0;
}

template <class T>
std::basic_string<T>& trim(std::basic_string<T>& s) 
{
    if (s.empty()) {
        return s;
  }

    std::basic_string<T>::iterator c;
    // Erase whitespace before the string

    for (c = s.begin(); c != s.end() && iswspace(*c++);); s.erase(s.begin(), --c);

    // Erase whitespace after the string

    for (c = s.end(); c != s.begin() && iswspace(*--c);); s.erase(++c, s.end());

    return s;
}

以下是我在gcc編譯的結果:{環境   gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)}   ps:我用的是trim.cpp

[[email protected] testConfig]# g++ trim.cpp
trim.cpp: In function ‘std::basic_string<_CharT, std::char_traits<_CharT>, std::allocator<_CharT> >& trim(std::basic_string<_CharT, std::char_traits<_CharT>, std::allocator<_CharT> >&)’:
trim.cpp:21: error: expected ‘;’ before ‘c’
trim.cpp:23: error: ‘c’ was not declared in this scope
trim.cpp: In function ‘std::basic_string<_CharT, std::char_traits<_CharT>, std::allocator<_CharT> >& trim(std::basic_string<_CharT, std::char_traits<_CharT>, std::allocator<_CharT> >&) [with T = char]’:
trim.cpp:11:   instantiated from here
trim.cpp:17: error: could not convert ‘s->std::basic_string<_CharT, _Traits, _Alloc>::empty [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’ to ‘bool’
trim.cpp:21: error: dependent-name ‘std::basic_string::iterator’ is parsed as a non-type, but instantiation yields a type
trim.cpp:21: note: say ‘typename std::basic_string::iterator’ if a type is meant


這裡報的是“變數c之前丟失分號”的錯誤,這其實是個誤導性的提示,重要的提示是我劃線的這兩句。一開始很迷惑,看了這個博文

http://blog.sina.com.cn/s/blog_69d9bff30101cx8f.html

後,明白是歧義造成的。gcc編譯器並不清楚std::basic_string<T>::iterator是一種型別還是std::basic<T>的成員,除非顯示宣告其為一個型別,因此直接加上typename關鍵字就行了。下面是更正後的程式碼。

trim.cpp

#include <iostream>
#include <string>

template <typename T>
std::basic_string<T>& trim(std::basic_string<T>& s);

int main(int argc, char* []) {
	std::string str = "   	hello world    ";
	std::cout << "before:" << str << std::endl;
	trim(str);
	std::cout << "after:" << str << std::endl;
	return 0;
}

template <typename T>
std::basic_string<T>& trim(std::basic_string<T>& s) {
	if (s.empty()) {
		return s;
	}

	typename std::basic_string<T>::iterator c;//c;

	for (c = s.begin(); c != s.end() && iswspace(*c++); );
	s.erase(s.begin(), --c);

	for (c = s.end(); c != s.begin() && iswspace(*--c); );
	s.erase(++c, s.end());

	return s;
}

相關推薦

定義C++ trim出現問題

在地址 http://blog.csdn.net/butterfly_dreaming/article/details/10142443 中,關於trim函式的方法3:gcc編譯器不能通過問題。  

定義jstl fnfns

span pla 聲明 代碼 XML s函數 對象 xsd lan 1、引入函數聲明: jsp頁面需要引入自定義fns函數聲明:<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %> (自定義的tld

定義事件處理

rem pan 時間函數 sna 自定義 n) cti .class ntb 解決了傳統事件處理函數的覆蓋問題、可讀性問題、this傳遞問題 1 //添加時間函數 2 function addEvent(obj,type,fn){ //obj相當

使用 PHP usort() 通過用戶定義的比較對數組進行排序

ron echo 自定義 輸出 turn 函數 tro [1] func usort() <?php$array[0] = array(‘key_a‘ => ‘z‘, ‘key_b‘ => ‘c‘);$array[1] = array(‘key_a‘

vue定義指令鉤子

前綴 可用 cnblogs 虛擬節點 參數 spa 詳細 object fun 一個指令定義對象可以提供如下幾個鉤子函數 (均為可選):bind:只調用一次,指令第一次綁定到元素時調用。在這裏可以進行一次性的初始化設置。inserted:被綁定元素插入父節點時調用 (僅保證

定義DOM事件封裝

nts create HA eat 支持 nta 默認事件 AS PE 非原生DOM觸發,個性化定制的自定義事件。 currentTarget(DOM對象):要觸發事件的元素節點。 type(字符串):觸發的事件類型,例如"keydown"。 bubbles(布爾值):表

laravel 5 定義全局,怎麽弄呢?

bsp psr-4 log ide r.js 增加 function apps fun 在app/Helpers/(目錄可以自己隨便來) 下新建一個文件 functions.php 在functions.php 中加入這個方法 然後在 bootstrap/autoload

mxnet-定義前向

3.3 eat per usr none pytho 2.7 urn near #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Fri Aug 10 16:13:29 2018 @author:

Vue學習筆記十一:按鍵修飾符和定義指令(鉤子)

ear 簡寫 bar 更多 盜鏈 esc 聚焦 component 默認 目錄 padStart:補位 按鍵修飾符 Vue提供的按鍵修飾符 自定義按鍵修飾符

為什麽 c++中模板和類模板的 聲明與定義需要放到一起?

color code 我們 ack 二進制 通過 如果 之前 類型 將模板的聲明與定義寫在一起實在很不優雅。嘗試用“傳統”方法,及在.h文件裏聲明,在.cpp文件裏定義, 然後在main函數裏包含.h頭文件,這樣會報鏈接錯誤。why!!!!!!!!!!!!! 這是因為函數模

關於一個多個.cpp檔案的專案中,出現定義引用錯誤

編譯的話,必須把全部的c檔案都要編譯的啊,只編譯一個c算怎麼個邏輯呢?編譯實際上是2個過程,編譯和連結。編譯過程只檢查所有的符號(變數,函式)有沒有宣告,即只需要h檔案生命就夠了。但是連結時候,需要找到全部的函式的實現體,不把所有的.cpp一起編譯,電腦怎麼知道你還有檔案呢,它又不是神仙會算。簡單說就是,gc

python小結(二) 白總結)&生成器&叠代器(定義

time 鍵值 gen log 元組 默認 增加 http 特殊 【def】 定義一個函數 f() 調用這個函數 f 只是相當於調用一個函數對象,返回的是一個函數的內存地址,要搞清楚這一點,這樣會對以後高階函數的理解有幫助 def f():

Linux C語言gets出現的警告問題解決

在Linux下編譯C語言,用到gets這個函式,程式碼如下: #include <stdio.h>#include <string.h>#include <string.h>void main(){    char s[100];  // 存

SQL 中常用的功能定義的功能行

指定 數據 begin returns smi 自定義 rst abcd ted 在SQL Server指定的數據庫中,有Programmability目錄,在這個目錄下,有存儲過程,有功能函數。 set ANSI_NULLS ON set QUOTED_IDE

C++類的定義,成員定義,對象的創建與使用

color ostream err c++ div span bsp 但是 style ---恢復內容開始--- 類是一個模板,可用類生成一系列可用的實例。例如 int B就是生成了一個符合int的數據B,類也是一樣,使用類名就可以直接生成一個實例, 該實例中包含類中所

C語言自己寫的出現“error LNK2001: 無法解析的外部符號“

最近寫作業,出現 main.obj : error LNK2001: 無法解析的外部符號 "void __cdecl creatlist(struct list_type *)" (?creatlist@@YAXPAUlist_type@@@Z), 看網上的教材,是外部引用

Android jni c/c++線程通過CallVoidMethod調用java出現奔潰問題

== nat 地方 delete ext new delet cvt getenv 最近在移植網絡攝像機裏的p2p庫到android平臺,需要用到jni,最近在c線程了調用java函數的時候 出現一個問題,假如在同一個線程調用java函數是沒問題的,但在一個c線程了調用ja

java中string.trim()的作用

main ati cnblogs return style ret blog substr system trim /[tr?m] / 英文意思:整理,修理,修剪,整齊的 trim()的作用:去掉字符串首尾的空格。 public static void main(S

C++ 常

c++ 常函數常函數的意義對與普通函數來說,因為const關鍵字的增加,體現在對類成員的保護上,現在加以講解:#include <iostream> using namespace std; class Ctest { private: int a; public: Cte

Java - split()trim()的使用方法

rac out api src ber div 使用 spa tro split()函數和trim()函數的使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24465141 詳細參考J