自定義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 fn函數fns
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